Python 如何实现其类型对象,即类型类型始终是类型?

2024-01-26

我知道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(使用前将#替换为@)

Python 如何实现其类型对象,即类型类型始终是类型? 的相关文章

随机推荐

  • Magento如何缓存productCollection

    我注意到我的主页需要很长时间才能加载 根据 site24x7 com 事实上超过 6 秒 所以我一直在关闭元素以尝试确定原因是什么 这取决于我制作的 2 个产品集合文件展示新产品和畅销产品 当我从主页中删除这些内容后 页面加载时间不到 0
  • Primefaces 数据表冻结列未对齐

    我们有一个数据表 如图所示 有 3 个冻结列 其余可滚动 冻结的列未对齐 如图所示 如果删除冻结列属性 则表看起来正常 任何解决问题的建议 我过去在冻结数据表方面遇到过类似的问题 并在不同的帖子中使用许多不同的脚本 我发现下面的脚本适用于所
  • 当你克隆 `&str` 时会发生什么?

    当你克隆一个时会发生什么 str 是克隆的吗 str指向与克隆者相同的地方 str或者是什么 这有记录在任何地方吗 克隆一个 str与克隆任何相同 T 它只是复制引用 从字面上看 它只是返回自身 https doc rust lang or
  • .FillRectangle 不绘制任何内容

    我无法弄清楚为什么 FillRectangle 不适合我 此外 由于它没有抛出任何异常 我不知道为什么会这样 所以我在这里需要一些帮助 受影响的代码部分是这样的 try using FileStream fileStream File Op
  • 直接从 JavaScript 访问 GET?

    我想我可以使用 PHP 来访问 GET来自 JavaScript 的变量 但也许它更简单 有没有办法直接用JS实现呢 Look at window location search 它将包含一个像这样的字符串 foo 1 bar 2 要将其转
  • 核心数据使用一次后<故障>

    我搜索了几个小时但没有找到任何东西 我处于有线状态核心数据 获取对象的方法 func fetchAllCoreData gt NSArray let moc DataController managedObjectContext let f
  • 如何在android中的gridview适配器的getView()内膨胀另一个布局?

    I want to create weekly calendar view and inside each grid item each day there are may be several activities Out of this
  • 关闭时控制台关闭过程[重复]

    这个问题在这里已经有答案了 我将一个DLL注入到一个进程中 在该进程的入口点我生成一个新线程并分配一个控制台 我将所有std重定向到控制台 当我关闭控制台窗口时整个进程关闭 有没有办法这样它就不会关闭进程 这是我的代码 入口点 pragma
  • 如何识别用户何时开始和停止在 android 中说话? (Android 中的语音识别)

    我已经进行了大量的研发并使用了大量的资源来解决我的问题 但我未能找到任何适当的解决方案 我已经开发了一个应用程序 现在我想添加基于语音的功能 to it 所需的功能是 1 when USER开始说话 应该录制音频 视频 and 2 当用户停
  • StreamSubscription.cancel 与 StreamController.close 在内存泄漏方面的比较

    是否打电话StreamController close自动取消StreamSubscription并删除所有引用 我认为这是有道理的 但我无法在文档中找到它来确定 我有以下代码 dispose context bloc blocSubscr
  • Netsuite Suitescript可以修改文件柜中的文件吗?

    我有一个很大的产品列表 需要生成它的静态文件 并让该文件可以在我的网站中访问 目前 我生成列表 并将其上传到文件柜 我希望自动化这个过程 我想安排一个 SuiteScript 每晚运行并生成此列表并更新文件柜中的文件 这可以做到吗 than
  • HTTP 直播 MPEG TS 段

    我使用 FFMPEG 和免费分段器 Carson Mcdonald s 来生成我的 ts 片段 然后将其保存到网络服务器并通过播放 m3u8 来使用 Quicktime 进行播放 如果我有段 1 2 3 4 和另一个包含段 1 2 3 4
  • 解释一下莫名其妙的死锁

    首先 我不明白我怎么能得到any根本没有死锁 因为我没有使用显式锁定 所以只涉及一个表 每个进程都有一个单独的进程来插入 选择和更新行 一次只插入或更新一行 并且每个进程很少 也许一分钟一次 完全运行 这是一个电子邮件队列 CREATE T
  • 从 Visual Studio 在 Linux docker 容器中调试 nunit 测试

    我正在尝试更改我们的 NET Core 3 0 应用程序以在 Linux 容器中运行 我已经到了可以在容器内恢复和构建的地步 但测试失败了 这是预期的 该应用程序中的某些内容仅适用于 Windows 计算机 我想从 Windows 上的 V
  • 配置 Play 1.x/JPA 以顺序生成实体 ID?

    强制 Play JPA 使实体 ID 连续的最佳方法是什么 他们不是 https stackoverflow com questions 9771532 are jpa ids sequential 一种想法是将 play db jpa M
  • 谁能告诉我当我尝试添加syncfusion_flutter_pdfviewer包时flutter中的这个错误是什么

    当我在 yaml 文件中添加syncfusion flutter pdfviewer 包时 出现以下错误 谁能告诉我那个错误状态是什么 C src flutter pub cache hosted pub dartlang org sync
  • 如何在Docker中使用“绑定挂载”

    运行此命令后 我在日志中收到错误 docker run d p 3000 80 name Feedback app v 反馈 app feedback v WorkSpace d data volumes 03 adj node code
  • 如何在Linux命令行中运行jar文件

    如何将类路径设置为当前目录并运行名为的 jar 文件load jar通过提供参数作为当前目录中的内容load 2从 Linux 命令行 我确实尝试按如下方式运行该 jar 但它从其他目录执行类 java cp load jar CLASSP
  • 通过多线程访问文件

    我想通过10个线程访问一个大文件 文件大小可能从30MB到1GB不等 然后通过10个线程处理文件中的每一行并将它们写入另一个文件 如果我只使用一个线程访问IO 其他线程就会被阻塞 该处理花费的时间几乎相当于从文件系统读取一行代码 还有一个限
  • Python 如何实现其类型对象,即类型类型始终是类型?

    我知道Python中的所有东西都是一个对象 并且这些对象的 类型 或类 是 类型 另外 类型的类型也是类型本身 正如解释得很好here http www cafepy com article python types and objects