You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中self的底层工作机制及相关原理咨询

Python中self的底层工作原理

你的初始解释是否准确?

你的核心理解是对的,但有几个关键细节需要补充:

  • 定义class Foo时生成的Foo不是普通对象,而是类型对象(CPython中PyTypeObject的实例),它负责管理该类所有实例的行为和属性。
  • 实例foo的__dict__仅存储实例专属属性(比如self.x),而类Foo的__dict__存储类方法、类属性等共享资源。
  • 调用foo.bar(3.14)时,确实会先在foo.__dict__中查找bar,找不到则向上到Foo.__dict__中查找。找到原始函数后,解释器会自动把foo作为第一个参数传入,等价于手动调用Foo.bar(foo, 3.14)。

foo是如何传递给方法的?

这是Python解释器的自动绑定机制在起作用:
当你通过实例foo访问类中的函数bar时,解释器会自动将这个普通函数包装成一个绑定方法对象(bound method)。这个绑定方法会“记住”所属的实例foo,当你调用它时,就会自动把foo作为第一个参数传递给原始的bar函数。

底层实现上,CPython中所有对象都是PyObject结构体的实例,每个对象都有一个内存地址指针。传递foo本质就是传递这个指针,让函数能直接访问实例的内存空间,读取或修改其属性。

PyObject和PyTypeObject的作用

在CPython的C底层实现中:

  • PyObject是所有Python对象的基结构体,每个对象都包含两个核心字段:
    • ob_refcnt:引用计数,用于垃圾回收。
    • ob_type:一个指针,指向该对象所属的类型对象(即PyTypeObject实例)。
  • PyTypeObject是描述类型的结构体,比如Foo就是PyTypeObject的一个实例。它定义了该类型的所有行为规则:
    • 实例化的逻辑(比如__init__对应的底层方法)。
    • 属性查找的规则(比如tp_getattro方法,负责处理foo.bar这类属性访问)。
    • 该类型支持的方法、运算符重载等信息。

当你创建foo = Foo(1)时,解释器会根据Foo这个PyTypeObject的定义分配内存,生成一个PyObject实例(即foo),并把foo的ob_type指针指向Foo。后续的属性查找、方法调用,都是通过ob_type指针找到对应的PyTypeObject,再执行其定义的逻辑完成的。

内容的提问来源于stack exchange,提问作者FISR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:15:05