爲了吸引您的眼球:元類可以被調用嗎?
我認爲文檔可能是錯的!
根據Python 2.7.12文檔,3.4.3。定製類creation¶:
__metaclass__
此變量可以是任何調用接受 論據名,鹼和字典。在創建課程時,使用可調用的 代替內置的type()
。版本2.2中的新功能。
然而,this article認爲:
Q:哇!我可以使用任何類型的對象作爲
__metaclass__
嗎?A:否。它必須是基礎對象類型的子類。 ...
所以,我做我自己的一個實驗:
class metacls(list): # <--- subclassing list, rather than type
def __new__(mcs, name, bases, dict):
dict['foo'] = 'metacls was here'
return type.__new__(mcs, name, bases, dict)
class cls(object):
__metaclass__ = metacls
pass
這給了我:
Traceback (most recent call last):
File "test.py", line 6, in <module>
class cls(object):
File "test.py", line 4, in __new__
return type.__new__(mcs, name, bases, dict)
TypeError: Error when calling the metaclass bases
type.__new__(metacls): metacls is not a subtype of type
所以是文檔真的錯了嗎?
「綁定到」的意思是「一個子類」,對吧? –
@sunqingyao:不,綁定表示分配給。賦值'Foo = []'被執行。一個'class'語句基本上被視爲一個函數;正如函數中一樣執行主體,並將所有本地名稱提取到字典中。然後通過調用'bodydict.get('__ metaclass__',type)'(所以'__metaclass__'的值或者如果缺少'type'')並傳入類名稱,類的基類,以及身體字典。 *無論返回*分配給班級的名稱。綁定是技術術語;其他的東西也綁定了,比如'import'或'for'。 –
但是通過說「mcs'綁定到'list'」,你似乎意思是「mcs'是'list'的子類的一個實例。 –