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

为何Python中实例方法`is`判断为False,类方法却为True?

为啥实例方法的is判断会返回False?

这个问题其实戳中了Python里**方法绑定(method binding)**的底层逻辑,咱一步步拆解清楚:

1. 类层面的方法:同一个函数对象

对于类A来说,A.foo是直接存在类属性字典里的未绑定函数。不管你用getattr(A, 'foo')还是直接写A.foo,拿到的都是同一个函数对象的引用——毕竟它就固定存在类的内存空间里,没理由每次访问都变。所以getattr(A, 'foo') is A.foo返回True完全合理。

2. 实例层面的方法:每次访问都生成新的绑定对象

当你创建实例a = A()后,事情就不一样了:
每次你访问a.foo(不管是直接写还是用getattr(a, 'foo')),Python都会动态创建一个全新的「绑定方法(bound method)」对象。这个对象的作用是把实例a和类的函数A.foo绑定起来,这样当你调用a.foo()时,它会自动把a作为self参数传给A.foo。

虽然打印出来的字符串看起来完全一样(都是<bound method A.foo of <__main__.A object at 0x...>>),但它们是内存中完全不同的对象。你可以打印内存地址验证:

a = A()
print(id(a.foo))  # 比如输出 140658371718224
print(id(a.foo))  # 再输出 140658371718352——两次不一样!

这就是为啥getattr(a, 'foo') is a.foo和a.foo is a.foo都返回False的原因:每次访问都生成了新的绑定方法实例,内存地址不一样,is判断自然不相等。

补充:绑定方法的小细节

绑定方法其实是一个中间代理对象,它保存了两个关键信息:

  • 要绑定的实例(比如a)
  • 对应的类函数(比如A.foo)
    当你调用这个绑定方法时,它会把实例作为第一个参数传给类函数,完成调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:55:22