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
相关产品推荐
相关产品推荐

