我試圖讓我的頭繞着元類,但我仍然不能真正理解它的概念。瞭解Python中的元類
據我所知:
任何類本身類型的「類型」的一個實例 - 因此「呼叫」一類的只是調用它的類中的方法__call__
- 這恰好是類型的__call__
。的type.__call__
的效果是完全:上類似的代碼:
A類: 通 B = A()
的步驟的順序我知道這裏是:
1. type.__call__
接收A類本身作爲其第一個參數。
- 它調用
A.__new__
- 以僞代碼的形式,我們可以編寫instance = A.__new__(cls)
作爲運行的代碼。
3.That返回 「A」 類的一個實例
4.然後在實例(instance.__init__()
) 調用__init__
...並返回該實例返回實例
但現在考慮下面的代碼:
class MetaOne(type):
def __new__(meta, classname, supers, classdict):
print('In MetaOne.new:', meta, classname, supers, classdict, sep='\n...')
return type.__new__(meta, classname, supers, classdict)
class Eggs:
pass
print('making class')
class Spam(Eggs, metaclass=MetaOne):
data = 1
def meth(self, arg):
return self.data + arg
print('making instance')
X = Spam()
print('data:', X.data, X.meth(2))
從這個腳本的輸出如下:
making class
In MetaOne.new:
...<class '__main__.MetaOne'>
...Spam
...(<class '__main__.Eggs'>,)
...{'__qualname__': 'Spam', '__module__': '__main__', 'meth': <function Spam.met
h at 0x00000000010C1D08>, 'data': 1}
making instance
data: 1 3
所以,按照我的理解,這是步驟的順序:
由於垃圾郵件是MetaOne的一個實例,調用
X = Spam()
會嘗試調用MetaOne類是不存在的__call__
方法。由於MetaOne繼承了類型,因此會調用
__call__
類型爲Spam
的方法作爲第一個參數。
此後在MetaOne類的__new__
方法調用的土地了,但它應該包含Spam
作爲第一個參數。
從哪裏MetaOne類的meta
爭論進入畫面。
請幫我理解。