我碰到下面的代碼來一邊唸叨元類here,雖然我不知道這種區別是特定於元類,我懷疑這是不是:爲什麼__new__和__init__在向超類踢球時表現出不同的表現?
class MetaBase(type):
def __new__(mcl, name, bases, nmspc):
print('MetaBase.__new__\n')
return super(MetaBase, mcl).__new__(mcl, name, bases, nmspc)
def __init__(cls, name, bases, nmspc):
print('MetaBase.__init__\n')
super(MetaBase, cls).__init__(name, bases, nmspc)
注意,super().__init__()
呼叫省略第一論據。我猜它是隱式傳遞的,因爲它正在調用一個由super()
返回的任何類的方法。這就是我通常看到的構建這樣的調用的方式,雖然它們通常涉及到一個普通類上的self
而不是元類上的cls/mcl。
儘管如此,super().__new__()
調用通過mcl
明確。我不明白爲什麼。簽名看起來和我一樣。
我很困惑。在每種情況下,super()
是否會返回不同的東西?這裏發生了什麼事情,並且我應該在重寫其他魔術方法時期望被這個問題咬傷?
[編輯:有人建議這是this question的重複,它描述了它們的不同功能。而同樣差異中的一些例子顯示出在那裏,我看到或沒有說明爲什麼它的存在無論是獨特的__new__
]
'__new__'是一種靜態方法。 '__init__'是一個實例方法。 – spectras
[Python使用\ _ \ _ new \ _ \ _和\ _ \ _ init \ _ \ _?]的可能重複(http://stackoverflow.com/questions/674304/pythons-use-of-new-and- init) – spectras
關於編輯,'__new__'官方文檔的第一句話:「[__new __()是一個靜態方法(特殊的,所以你不需要聲明它)](https://docs.python.org/3 /參考/數據模型。html#object .__ new__)「 – spectras