gpt4 book ai didi

python - Python 如何实现它的类型对象,即类型总是类型?

转载 作者:太空狗 更新时间:2023-10-30 03:03:31 26 4
gpt4 key购买 nike

我知道 python 中的一切都是对象,并且这些对象的“类型”(或类)是“类型”。加上类型的类型也是类型本身。 (解释得很好 here )

我不明白的是这个循环引用是如何实现的?所以我看了here .引用可能解释我正在寻找的内容的部分:

PyTypeObject* PyObject.ob_type

这是类型的类型,换句话说就是它的元类型。它由 PyObject_HEAD_INIT 宏的参数初始化,其值通常应为 &PyType_Type。但是,对于必须在 Windows 上可用(至少)的动态可加载扩展模块,编译器会提示这不是有效的初始化程序。因此,约定是将 NULL 传递给 PyObject_HEAD_INIT 宏,并在模块的初始化函数开始时显式初始化此字段,然后再执行其他操作。这通常是这样完成的:

Foo_Type.ob_type = &PyType_Type;

因为 C 不是基于 OOP 的,所以我知道当一个人创建一个类时,它可以有一个属性来指向对象本身作为它自己的类。我确信我在这里缺乏理解导致我处于困惑状态,任何人都可以指出这是其他脚本语言或某种模式设计中的通常做法,如果有人可以对此有所了解,我将不胜感激。

编辑: 我发现了 here那:

PyObject* PyType_Type

这是类型对象的类型对象;它与Python层中的type和types.TypeType是同一个对象。

怎么样?

最佳答案

定义 PyType_Type.ob_type = &PyType_Type 的代码涉及几个间接。这一切都始于调用 PyType_Ready(&PyType_Type) 时的函数 _Py_ReadyTypes()。在调用函数之前,成员tp_baseob_type都是NULL。该函数首先将type->tp_base设置为&PyBaseObject_Type(即Python空间中的object),然后设置type->ob_type = PyBaseObject_Type.ob_type。代码使用 Py_TYPE(),它只是 ob->ob_type 的宏。由于对象的类型是 type,因此代码将 type 的类型设置为 type。

现在你有:

>>> type.__bases__
(<class 'object'>,)
>>> type(object)
<class 'type'>
>>> type(type(object))
<class 'type'>

定义使类型成为对象加上自身的实例,对象成为类型的实例。

>>> isinstance(type, object)
True
>>> isinstance(object, type)
True
>>> isinstance(type, type)
True

类型初始化代码在 Python 伪代码中更容易理解:

# object's class is type
object.__class__ = type
# PyType_Ready(type) sets:
type.__bases__ = (object,)
type.__class__ = type(object)

关于python - Python 如何实现它的类型对象,即类型总是类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18692033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com