Использование метода __new__ класса в качестве Factory: __init__ вызывается дважды

Я столкнулся со странной ошибкой в ​​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

Любая помощь очень ценится.

36
задан xApple 10 May 2011 в 17:11
поделиться