簡體   English   中英

Python 3:對象如何成為類型的實例?

[英]Python 3: How can object be instance of type?

在 Python 3 中, objecttype的一個實例, type也是object的一個實例!

每個類怎么可能派生自另一個類?

任何實施細節?

我使用isinstance(sub, base)檢查了這一點,根據 Python 文檔,它檢查子類是否派生自基類:

isinstance(object, type)
Out[1]: True

isinstance(type, object)
Out[2]: True

這是 Python 中的邊緣案例之一:

  • 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的實例”部分實際上是硬編碼到實例檢查中的。

至於為什么objecttype ,這實際上更簡單,因為它只是在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM