[英]Python 3: How can object be instance of type?
在 Python 3 中, object
是type
的一個實例, type
也是object
的一個實例!
每個類怎么可能派生自另一個類?
任何實施細節?
我使用isinstance(sub, base)
檢查了這一點,根據 Python 文檔,它檢查子類是否派生自基類:
isinstance(object, type)
Out[1]: True
isinstance(type, object)
Out[2]: True
這是 Python 中的邊緣案例之一:
object
是一切的基本類型,因此type
(在 Python 中是某種東西)是object
的一個實例。object
是一切的基本類型, object
也是type ,這使得object
成為type
的實例。請注意,這種關系不是您可以在 Python 中用您自己的東西復制的。 這是語言中內置的一個例外。
在實現方面,這兩個名稱分別由PyBaseObject_Type
(對於object
)和PyType_Type
(對於type
)表示。
當您使用isinstance
時,類型檢查(在最后一步,在其他所有操作都失敗后)由type_is_subtype_base_chain
完成:
type_is_subtype_base_chain(PyTypeObject *a, PyTypeObject *b)
{
do {
if (a == b)
return 1;
a = a->tp_base;
} while (a != NULL);
return (b == &PyBaseObject_Type);
}
這實質上是不斷上升a
的類型層次結構並對照b
檢查結果類型。 如果找不到,最后的手段是檢查b
是否實際上是object
,在這種情況下,函數返回 true:因為一切都是對象。 所以“一切都是object
的實例”部分實際上是硬編碼到實例檢查中的。
至於為什么object
是type
,這實際上更簡單,因為它只是在PyBaseObject_Type
的聲明中以這種方式定義的:
PyTypeObject PyBaseObject_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"object", /* tp_name */
sizeof(PyObject), /* tp_basicsize */
…
PyVarObject_HEAD_INIT
本質上設置了核心類型信息,包括基本類型PyType_Type
。
這種關系實際上還有兩個后果:
object
也是object
的一個實例: isinstance(object, object)
PyType_Type
也使用相同的PyVarObject_HEAD_INIT
實現,因此type
也是一個類型: isinstance(type, type)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.