Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 19, 2013 21:54:00

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

класс управляющий экземплярами других классов

помогите разобраться пожалуйста
есть такая задача (её макет):
есть классы A, B, и AB
в классе AB создаются экземпляры классов A и B
но будут ли использоваться атрибуты либо одного из экземпляров либо сразу обоих неизвестно
как правильно создать такую конструкцию
сам попробывал написать, получилось так:

class A(object):
def __init__(self, x):
self.x = x

class B(object):
def __init__(self, x):
self.x = x

class AB(object):
def __init__(self, obj1=True, obj2=False):
self.obj1 = obj1
self.obj2 = obj2

self.listValuesInstAB = []
self.defineBlocks()

def defineBlocks(self):

if self.obj1:
a = A("a_value")
self.listValuesInstAB.append(a.x)
if self.obj2:
b = B("b_value")
self.listValuesInstAB.append(b.x)
if self.listValuesInstAB == []:
raise Exception("not created any instance")
как можно написать по другому, может есть готовые шаблоны решения подобных задач?

Отредактировано vrabey (Авг. 19, 2013 21:54:55)

Офлайн

#2 Авг. 19, 2013 22:14:16

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

класс управляющий экземплярами других классов

зачем по-другому?
что тебя не устраивает?

Офлайн

#3 Авг. 19, 2013 22:44:35

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

класс управляющий экземплярами других классов


sergeek
зачем по-другому? что тебя не устраивает?
мой не богатый опыт показывает что очевидные для меня способы решения задачи можно решить лакониченее или вообще по другому
как бы для решения конкретной задачи моего решения хватает но задача может слегка видоизмениться или сильно усложниться и поэтому хотельсь бы знать другие подходы и
в конце концов хочется вместе с решением конкретных задач ещё и учиться разширять диапазон инструментов …

Офлайн

#4 Авг. 19, 2013 22:53:52

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

класс управляющий экземплярами других классов

в том виде в котором ты ее представил оно вполне лаконично.
Если бы этих A,B и/или AB классов было бы больше, то тогда можно было бы повысить уровень абстракции.
А так все ок, мне кажется

Офлайн

#5 Авг. 19, 2013 23:05:00

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

класс управляющий экземплярами других классов

sergeek
в реальной задаче их больше правда не намного - 4(A, B классов),
но я понял - появится не решённая проблема появится и другой вопрос
спасибо

Офлайн

#6 Авг. 20, 2013 05:09:19

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

класс управляющий экземплярами других классов

class A(object):
    def __init__(self, x):
        self.x = x
        
    def __repr__(self):
        return "A('%s')" % self.x
    
class B(object):
    def __init__(self, x):
        self.x = x
        
    def __repr__(self):
        return "B('%s')" % self.x
class AB(object):
    def __init__(self, *args):
        self.instance_classes = [x[0] for x in args]
        self.instance_values = [x[1] for x in args]
        self.define_blocks()
        
    def define_blocks(self):
        self.list_instances = [cls(start_value) for (cls, start_value) in
            zip(self.instance_classes, self.instance_values)]
        if not self.list_instances:
            raise Exception("not created any instance")
ab1 = AB((A, 'a_value'))
print ab1.list_instances
ab2 = AB((B, 'b_value'))
print ab2.list_instances
ab3 = AB((A, 'a_value'), (B, 'b_value'))
print ab3.list_instances

ЗЫ: А почему просто не инициализировать класс AB списком экземпляров нужных объектов?
class AB(object):
    def __init__(self, *args):
        self.list_instances = args[:]
        if not self.list_instances:
            raise Exception("not created any instance")
ab1 = AB(A('a_value'))
print ab1.list_instances
ab2 = AB(B('b_value'))
print ab2.list_instances
ab3 = AB(A('a_value'), B('b_value'))
print ab3.list_instances



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано PooH (Авг. 20, 2013 05:13:55)

Офлайн

#7 Авг. 20, 2013 11:34:33

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

класс управляющий экземплярами других классов

PooH
спасибо пример понятен ,но не могу понять как применить к моему конкретному случаю(слишком упрощённо я его описал)
попробую уточнить :
после запуска программы пользователь с помощью gui определяет свойства описанные в классах A или B или в обоих сразу
затем класс AB инициализирует либо A либо B классы либо оба
кроме этого класс AB в зависимости от того , что он инициализировал меняет собственные свойства или выбирает нужные методы
- “А почему просто не инициализировать класс AB списком экземпляров нужных объектов?”
заранее неизвестно какие экземпляры нужны

Офлайн

#8 Авг. 20, 2013 12:06:35

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

класс управляющий экземплярами других классов

Что-то слишком мутно: A,B, AB может давайте уже поговорим более предметно?

vrabey
после запуска программы пользователь с помощью gui определяет свойства описанные в классах A или B или в обоих сразу
затем класс AB инициализирует либо A либо B классы либо оба
кроме этого класс AB в зависимости от того , что он инициализировал меняет собственные свойства или выбирает нужные методы
У меня подозрение, что класс AB создается рановато, если неизвестно что он будет содержать, то может подождать с созданием до момента, когда будут все данные?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#9 Авг. 20, 2013 19:58:06

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

класс управляющий экземплярами других классов

PooH
очень тяжело оказывается объяснить “ более предметно” не себе но я попробывал.
врядли получилось сильно понятно но на другое умения не хватило
(класс CreationAllBlocks не рабочий (обозначены только ожидаемые методы))
вот код:

import ConfigMod
cfg = ConfigMod.CfgPars()
"""
модуль нужен что бы выдать четыре параметра (класс CreationAllBlocks):
1) имена изображений  (4 или 5) в зависимости от того какие блоки задействованы
   список кортежей например [8, (108, 208, 308, 408)]
2) номера (позиции) (4 или 5)  QLabel (всего 18) (билб.PyQt)  на которые выводится изображения
   список кортежей например - [7, (1, 2, 3, 4)] - 
3) каталог из которого беруться изображения зависит от аргумента - grafical
     если "image" то каталог с изображением предметов
     если "numeric" то каталог с изображением цифр
4) номера (позиций)  QLabel на которые выводится фото - пустышки
   например - [(1, 3)]
"""
gNameImageMod = "image"
gNameNumericMod = "numeric"
SequenceRandom = 'Random'
SequenceSeries = 'Series'
SequenceSeriesRever = 'SeriesRevers'
SequenceContinuousRandom = "ContinuousRandom"
class CreatedTopBlock:
    blockRange = (100, 499)        # диапазон цифр верхнего блока
    steprange = 100
    def __init__(self, grafical=gNameImageMod, visibleCollumns=None):
        self.visibleCollumns = visibleCollumns
        self.grafical = grafical
    
    def getNumbers(self, num):   
        return [x+num for x in range(self.blockRange[0], self.blockRange[1], self.steprange)]
    
    def getGrafical(self):
        return self.grafical       
class CreatedBottomBlock(CreatedTopBlock):
    blockRange = (500, 899)
class CreatedKeyBlock(CreatedTopBlock):
    blockRange = (0, 99)
    def __init__(self, grafical=gNameImageMod):
        self.grafical = grafical
class CreatedNineBlock(CreatedKeyBlock):
    blockRange = (900, 999)
    
class CreationAllBlocks:
    """
    аргументы: настраиваются пользователем чере Gui (используется модуль ConfigParser)
      logic_sequence=SequenceRandom   
      control_time=controlTime,       
      penalty_place=penaltyPlace,     
      topBlock=True,                  
      botBlock=False,                 
      keyBlock=False,                 
      nineBlock=False                 
    """
    layoutSingleTetraBlock = (7, 8, 9, 10)  # позиции если инициализирован только один из экземпляров
    layoutPairTetraBlock = (1, 2, 3, 4)
    layoutKeyBlock = 7
    layoutNineBlock = 8
    controlTime = 30
    penaltyPlace = 10
    def __init__(self,
                       logic_sequence=SequenceRandom,     # используемая последоватеьность см.глобальные переменные
                       control_time=controlTime,          # время через которое цифра будет добавлена обратно в список
                       penalty_place=penaltyPlace,        # позиция на которую отбрасывается цифра
                       topBlock=True,                     # """ вкл - выкл блоки; \
                       botBlock=False,                    # может быть включено максимум два блока, \
                       keyBlock=False,                    # один из которых обязатеьно 'keyBlock' """
                       nineBlock=False):                  
    
     self.logic_sequence = logic_sequence
     self.control_time = control_time
     self.penalty_place = penalty_place
     self.topBlock = topBlock 
     self.botBlock = botBlock
     self.keyBlock = keyBlock
     self.nineBlock = nineBlock
    def getLayoutBlock(self):
        ''' вернуть номера надписей (QLabel)'''
        pass
     
    def getNameFoto(self, num):
        ''' получить случайное число из класса генератора;
             вернуть имена изображений'''
        pass
    def getDirFoto(self):
        """ вернуть путь к каталогу"""
        pass
    
    def getNotVisiblePos(self):
        ''' вернуть номера надписей (QLabel) на которые выведены пустые фото'''
        pass
    
allBlock = CreationAllBlocks(logic_sequence=cfg.seq(),
                         control_time=cfg.control_time(),
                         penalty_place=cfg.penalty_place(),
                         topBlock=cfg.topBlock(),
                         botBlock=cfg.botBlock(),
                         keyBlock=cfg.keyBlock(),
                         nineBlock=cfg.nineBlock())
на фото скрин как это примерно выглядит в Gui

Отредактировано vrabey (Авг. 20, 2013 23:13:30)

Прикреплённый файлы:
attachment Снимок-5.png (40,4 KБ)

Офлайн

#10 Авг. 20, 2013 20:47:21

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

класс управляющий экземплярами других классов

vrabey
Почему бы не использовать dict, как это делается в похожем по смыслу задачи инструменте - ConfigParser (вот вам паттерн для примера).
Ключ каждого элемента соответствует созданному объекту.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version