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

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内部会自动完成以下逻辑:

  1. 取出绑定方法的__self__属性作为第一个参数
  2. 取出绑定方法的__func__属性拿到原始函数
  3. 执行原始函数(__self__, 你传入的其他参数),也就是等价于执行Example.some_method(example, "hi")

这样就实现了不需要手动传self就能调用实例方法的效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:36:05