Форум сайта python.su
помогите разобраться пожалуйста
есть такая задача (её макет):
есть классы 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)
Офлайн
зачем по-другому?
что тебя не устраивает?
Офлайн
sergeekмой не богатый опыт показывает что очевидные для меня способы решения задачи можно решить лакониченее или вообще по другому
зачем по-другому? что тебя не устраивает?
Офлайн
в том виде в котором ты ее представил оно вполне лаконично.
Если бы этих A,B и/или AB классов было бы больше, то тогда можно было бы повысить уровень абстракции.
А так все ок, мне кажется
Офлайн
sergeek
в реальной задаче их больше правда не намного - 4(A, B классов),
но я понял - появится не решённая проблема появится и другой вопрос
спасибо
Офлайн
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
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)
Офлайн
PooH
спасибо пример понятен ,но не могу понять как применить к моему конкретному случаю(слишком упрощённо я его описал)
попробую уточнить :
после запуска программы пользователь с помощью gui определяет свойства описанные в классах A или B или в обоих сразу
затем класс AB инициализирует либо A либо B классы либо оба
кроме этого класс AB в зависимости от того , что он инициализировал меняет собственные свойства или выбирает нужные методы
- “А почему просто не инициализировать класс AB списком экземпляров нужных объектов?”
заранее неизвестно какие экземпляры нужны
Офлайн
Что-то слишком мутно: A,B, AB может давайте уже поговорим более предметно?
vrabeyУ меня подозрение, что класс AB создается рановато, если неизвестно что он будет содержать, то может подождать с созданием до момента, когда будут все данные?
после запуска программы пользователь с помощью gui определяет свойства описанные в классах A или B или в обоих сразу
затем класс AB инициализирует либо A либо B классы либо оба
кроме этого класс AB в зависимости от того , что он инициализировал меняет собственные свойства или выбирает нужные методы
Офлайн
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())
Отредактировано vrabey (Авг. 20, 2013 23:13:30)
Прикреплённый файлы: Снимок-5.png (40,4 KБ)
Офлайн
vrabey
Почему бы не использовать dict, как это делается в похожем по смыслу задачи инструменте - ConfigParser (вот вам паттерн для примера).
Ключ каждого элемента соответствует созданному объекту.
Офлайн