Найти - Пользователи
Полная версия: класс управляющий экземплярами других классов
Начало » Центр помощи » класс управляющий экземплярами других классов
1 2
vrabey
помогите разобраться пожалуйста
есть такая задача (её макет):
есть классы 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")
как можно написать по другому, может есть готовые шаблоны решения подобных задач?
sergeek
зачем по-другому?
что тебя не устраивает?
vrabey

sergeek
зачем по-другому? что тебя не устраивает?
мой не богатый опыт показывает что очевидные для меня способы решения задачи можно решить лакониченее или вообще по другому
как бы для решения конкретной задачи моего решения хватает но задача может слегка видоизмениться или сильно усложниться и поэтому хотельсь бы знать другие подходы и
в конце концов хочется вместе с решением конкретных задач ещё и учиться разширять диапазон инструментов …
sergeek
в том виде в котором ты ее представил оно вполне лаконично.
Если бы этих A,B и/или AB классов было бы больше, то тогда можно было бы повысить уровень абстракции.
А так все ок, мне кажется
vrabey
sergeek
в реальной задаче их больше правда не намного - 4(A, B классов),
но я понял - появится не решённая проблема появится и другой вопрос
спасибо
PooH
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
vrabey
PooH
спасибо пример понятен ,но не могу понять как применить к моему конкретному случаю(слишком упрощённо я его описал)
попробую уточнить :
после запуска программы пользователь с помощью gui определяет свойства описанные в классах A или B или в обоих сразу
затем класс AB инициализирует либо A либо B классы либо оба
кроме этого класс AB в зависимости от того , что он инициализировал меняет собственные свойства или выбирает нужные методы
- “А почему просто не инициализировать класс AB списком экземпляров нужных объектов?”
заранее неизвестно какие экземпляры нужны
PooH
Что-то слишком мутно: A,B, AB может давайте уже поговорим более предметно?
vrabey
после запуска программы пользователь с помощью gui определяет свойства описанные в классах A или B или в обоих сразу
затем класс AB инициализирует либо A либо B классы либо оба
кроме этого класс AB в зависимости от того , что он инициализировал меняет собственные свойства или выбирает нужные методы
У меня подозрение, что класс AB создается рановато, если неизвестно что он будет содержать, то может подождать с созданием до момента, когда будут все данные?
vrabey
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
Lexander
vrabey
Почему бы не использовать dict, как это делается в похожем по смыслу задачи инструменте - ConfigParser (вот вам паттерн для примера).
Ключ каждого элемента соответствует созданному объекту.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB