Python 3:对象如何成为类型的实例?
Python 3: How can object be instance of type?
在Python3中,object
是type
的一个实例,type
也是object
的一个实例!
怎么可能每个 class 都派生自另一个?
任何实施细节?
我使用 isinstance(sub, base)
检查了这一点,根据 Python 文档,它检查子 class 是否派生自基础 class:
isinstance(object, type)
Out[1]: True
isinstance(type, object)
Out[2]: True
这是Python中的边缘案例之一:
- Python 中的所有内容都是一个对象,因此由于
object
是所有内容的基本类型,因此 type
(Python 中的内容)是 object
.
- 因为
object
是一切的基础类型,所以object
也是类型,这使得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
在这种情况下函数 returns 为真:因为一切都是对象。所以“一切都是 object
的实例”部分实际上被硬编码到实例检查中。
至于为什么object
是type
,这个其实更简单,因为它在declaration of 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)
.
在Python3中,object
是type
的一个实例,type
也是object
的一个实例!
怎么可能每个 class 都派生自另一个?
任何实施细节?
我使用 isinstance(sub, base)
检查了这一点,根据 Python 文档,它检查子 class 是否派生自基础 class:
isinstance(object, type)
Out[1]: True
isinstance(type, object)
Out[2]: True
这是Python中的边缘案例之一:
- Python 中的所有内容都是一个对象,因此由于
object
是所有内容的基本类型,因此type
(Python 中的内容)是object
. - 因为
object
是一切的基础类型,所以object
也是类型,这使得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
在这种情况下函数 returns 为真:因为一切都是对象。所以“一切都是 object
的实例”部分实际上被硬编码到实例检查中。
至于为什么object
是type
,这个其实更简单,因为它在declaration of 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)
.