您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python 3:对象如何成为类型的实例?

Python 3:对象如何成为类型的实例?

这是Python中的一种极端情况:

请注意,您无法在Python中用自己的 东西 复制这种关系。这是语言中内置的一个例外。

在实现方面,这两个名称分别由PyBaSEObject_Type(for object)和PyType_Type(for 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是atype,这实际上甚至更简单,因为它是在声明中以PyBaseObject_Type这种方式定义

PyTypeObject PyBaSEObject_Type = {
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
    "object",                                   /* tp_name */
    sizeof(PyObject),                           /* tp_basicsize */
    …

PyVarObject_HEAD_INIT本质上设置核心类型信息的东西,包括基本类型,这是PyType_Type

这种关系实际上还有两个后果:

python 2022/1/1 18:34:53 有226人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶