Я столкнулся с странной ошибкой в python, где использование метода __new__
класса как factory приведет к вызову метода __init__
экземпляра класса, который будет вызываться дважды.
__new__
материнского класса возвращал конкретный экземпляр одного из ее детей в зависимости от переданных параметров без необходимости объявлять функцию factory вне класса.
Я знаю, что использование функции factory было бы лучшим шаблоном проектирования, который будет использоваться здесь, но изменение шаблона проектирования в этой точке проекта было бы дорогостоящим. Поэтому мой вопрос: есть ли способ избежать двойного вызова __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
Любая помощь очень ценится.