Я столкнулся со странной ошибкой в python, когда использование метода __ new __
класса в качестве фабрики приводило к методу __ init __
созданного экземпляра класс будет называться дважды.
Первоначально идея заключалась в использовании метода __ new __
материнского класса для возврата определенного экземпляра одного из его дочерних классов в зависимости от переданных параметров, без необходимости объявлять фабричную функцию вне class.
Я знаю, что использование фабричной функции было бы лучшим шаблоном проектирования для использования здесь, но изменение шаблона проектирования на этом этапе проекта было бы дорогостоящим. Поэтому мой вопрос: есть ли способ избежать двойного вызова __ init __
и получить только один вызов __ init __
в такой схеме?
class Shape(object):
def __new__(cls, desc):
if cls is Shape:
if desc == 'big': return Rectangle(desc)
if desc == 'small': return Triangle(desc)
else:
return super(Shape, cls).__new__(cls, desc)
def __init__(self, desc):
print "init called"
self.desc = desc
class Triangle(Shape):
@property
def number_of_edges(self): return 3
class Rectangle(Shape):
@property
def number_of_edges(self): return 4
instance = Shape('small')
print instance.number_of_edges
>>> init called
>>> init called
>>> 3
Любая помощь очень ценится.