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

