Python将类实例方法赋值给变量时内部如何处理self参数?
Python绑定方法(bound method)的self存储与调用机制
你观察到的现象本质是Python实例方法绑定机制的特性,getattr从实例获取方法时拿到的绑定方法对象,本身已经预存了对应的self实例,调用时会自动传入,不需要手动传递。
1. 方法绑定的触发时机
当你从实例对象访问类中定义的方法时(无论是直接用.取属性还是通过getattr动态取),Python会自动执行「绑定」操作:把当前实例作为第一个参数self,和类的原始函数打包成一个新的bound method对象返回。getattr只是动态获取属性的语法,和直接.访问属性的逻辑完全一致,所以也会触发方法绑定。
如果是从类直接取方法,拿到的是未绑定的普通函数,调用时必须手动传入self参数,比如下面的写法和你代码里的调用效果完全等价:
# 直接调用类的未绑定方法,需要手动传self Example.some_method(example, "hi") # 输出 hi
2. self参数的存储位置
绑定方法对象内部内置了两个特殊属性,self就存在其中:
__self__:存储绑定的实例对象,也就是你代码里的example实例__func__:存储类中定义的原始未绑定函数,也就是Example.some_method
你可以加两行代码验证这个逻辑:
print(method1.__self__ is example) # 输出 True print(method1.__func__ is Example.some_method) # 输出 True
3. 绑定方法的调用过程
当你调用method1("hi")时,Python内部会自动完成以下逻辑:
- 取出绑定方法的
__self__属性作为第一个参数 - 取出绑定方法的
__func__属性拿到原始函数 - 执行
原始函数(__self__, 你传入的其他参数),也就是等价于执行Example.some_method(example, "hi")
这样就实现了不需要手动传self就能调用实例方法的效果。
内容的提问来源于stack exchange,提问作者T_Y
相关产品推荐
相关产品推荐

