Форум сайта python.su
В общем имеется некоторый базовый класс от которого унаследованы некоторые другие, мне нужно определить способ автоматического создания экземпляра нужного класса их этого перечня.
class Base: pass class First(Base): def somemethod(): # Specific to First class somemethod implementation pass class Second(Base): def somemethod(): # Specific to Second class somemethod implementation pass
class Base: def __init__(self, classid, params): if classid == "First": self.instance = First(params) if classif == "Second": self.instance = Second(params) def get_instance(): return self.instance class First(Base): def somemethod(): # Specific to First class somemethod implementation pass class Second(Base): def somemethod(): # Specific to Second class somemethod implementation pass InstanceOfRequiredClass = Base(classid, *params).get_instance()
Офлайн
> Насколько я понял в терминологии паттернов проектирования
Забудь про паттерны проектирования:
def getInstanc(classid, params): if classid == "First": return First(params) else: return Second(params) InstanceOfRequiredClass = getInstanc(classid, params)
Офлайн
RodegastБыло б чего забывать.
Забудь про паттерны проектирования:
Отредактировано iDarkLord (Окт. 7, 2016 15:14:57)
Офлайн
> Но проблема с ифами как была так и осталась.
Ели тебе if не нравится то можешь писать как-то так:
globals()[classid](params)
Отредактировано Rodegast (Окт. 7, 2016 15:56:32)
Офлайн
iDarkLord
как одно из решений, которое широко применялось (по крайней мере раньше) можно регистрировать дочерние классы базовым классом. Условный пример:
class Factory: _storage = {} @classmethod def register_class(cls, class_obj, slug): cls._storage[slug] = class_obj def __call__(self, slug, *args, **kwargs): return Factory._storage[slug](*args, **kwargs) class Base: def __init__(self, name): self._name = name def __str__(self): return '{} "{}"'.format(self.__class__.__name__, self._name) class First(Base): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def somemethod(): # Specific to First class somemethod implementation pass class Second(Base): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def somemethod(): # Specific to Second class somemethod implementation pass Factory.register_class(First, 'first') Factory.register_class(Second, 'second') factory = Factory() print(factory(slug='second', name='2nd class')) print(factory(slug='first', name='1st class'))
Офлайн