我知道Python中的所有东西都是一个对象,并且这些对象的“类型”(或类)是“类型”。另外,类型的类型也是类型本身。 (正如解释得很好here http://www.cafepy.com/article/python_types_and_objects/python_types_and_objects.html)
我不明白的是这个循环引用是如何实现的?所以我看了here http://docs.python.org/2/c-api/typeobj.html。引用可能解释我正在寻找的内容的部分:
PyTypeObject* PyObject.ob_type
这是类型的类型,换句话说,它的元类型。它由 PyObject_HEAD_INIT 宏的参数初始化,其值通常应为 &PyType_Type。但是,对于必须(至少)在 Windows 上可用的动态可加载扩展模块,编译器会抱怨这不是有效的初始值设定项。因此,约定是将 NULL 传递给 PyObject_HEAD_INIT 宏,并在执行其他操作之前在模块初始化函数开始时显式初始化该字段。这通常是这样完成的:
Foo_Type.ob_type = &PyType_Type;
由于 C 不是基于 OOP 的,所以我知道当创建一个类时,它可以有一个属性来指向对象本身作为它自己的类。我确信我在这里缺乏理解使我陷入了困惑,任何人都可以指出这是否是其他脚本语言或某种模式设计中的常见做法,如果有人可以对此有所了解,我将对此感激不尽。
EDIT :我发现here http://docs.python.org/2/c-api/type.html#PyType_Type that:
PyObject* PyType_Type
这是类型对象的类型对象;它与Python层中的type和types.TypeType是同一个对象。
那个怎么样?
定义 PyType_Type.ob_type = &PyType_Type 的代码涉及一些间接寻址。一切都从函数开始_Py_ReadyTypes()
当它调用时PyType_Ready(&PyType_Type)
。在调用函数之前,成员tp_base
and ob_type
都是NULL
。该函数首先设置type->tp_base
to &PyBaseObject_Type
(这是object
在Python空间中)然后设置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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)