2017-08-22 72 views
1

當檢查內置類型NotImplementedType時,我發現了一些奇怪的東西。爲什麼NotImplementedType不是一個類型子類?

>>> from types import NotImplementedType 
>>> issubclass(NotImplementedType, type) 
False 
>>> type(NotImplementedType) 
<type 'type'> 

這兩件事怎麼可能是真的? NotImplementedType如何不能成爲type的子類,但尚未從type派生?

+3

通過使用'型(..)'上'型(..)'你獲得*元型*,和元型'NotImplementedType'確實'type' (大多數類型都有元類型'type')。但這並不意味着這個類本身就是一個類型的子類。 –

+1

不知道爲什麼這個完全合法的問題是得到downvoted – endolith

回答

3

類不是type的子類,包括types.NotImplementedTypetype是類的元類

例如,自定義類和內置類型都沒有的type要麼子類:

>>> class Foo: pass 
... 
>>> issubclass(Foo, type) 
False 
>>> issubclass(int, type) 
False 

只有其他元類的子類type;像ABCMeta元類:

>>> from abc import ABCMeta 
>>> issubclass(ABCMeta, type) 
True 

這類似於實例和類;實例不是它們類的子類;使用isinstance()

>>> issubclass(Foo(), Foo) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: issubclass() arg 1 must be a class 
>>> isinstance(Foo(), Foo) 
True 
>>> import types 
>>> isinstance(types.NotImplementedType, type) 
True 
+0

我很想聽聽什麼是對我的答案沒有幫助或錯誤,值得downvote。這樣我可以改善我的答案! –

相關問題