我在Python中遇到了一個奇怪的錯誤,其中使用類的__new__
方法作爲工廠將導致實例化類的方法被調用兩次。使用類'__new__方法作爲工廠:__init__被調用兩次
這個想法最初是使用母類的__new__
方法根據傳遞的參數返回她的一個孩子的特定實例,而無需在類之外聲明工廠函數。
我知道使用工廠函數將是這裏使用的最佳設計模式,但在項目的這一點改變設計模式將代價高昂。因此,我的問題是:有沒有辦法避免對__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
任何幫助非常感謝。
非常感謝,這完美地解決了我的問題。 – xApple
使用'return Rectangle .__ new __(Rectangle)'會不會更好,因爲這樣可以保證如果定義了'Rectangle'的'__new__'會被調用嗎? –
@Georg,如果你這樣做,你將必須非常小心,以避免無限遞歸。任何類特定的初始化應該放在'__init__'中,所以我認爲在這裏假設'__new__'唯一的工作是創建一個正確類型的對象是非常安全的。 – Duncan