Python中对象.方法的取值问题:实例方法绑定差异解析
Python实例方法访问的本质与绑定机制
1. <object name>.<method name> 的值是什么?
通过实例访问类中定义的方法时,得到的是**绑定方法(bound method)**对象。这个对象会把当前实例和类的原始函数绑定在一起,调用它时会自动将实例作为第一个参数(也就是self)传入原始函数。
2. 代码里的foobar1和foobar2具体是什么?
foobar1 = foo1.bar 生成的是绑定了foo1实例的bar方法对象,foobar2 = foo2.bar 则是绑定了foo2实例的bar方法对象。它们不是类里定义的原始Foo.bar函数,而是包裹了实例和原始函数的独立对象。
3. 为什么print(foobar1 is foobar2)输出False?
每个绑定方法都是单独创建的对象,它们绑定的实例(foo1和foo2)是不同的——哪怕关联的是同一个类函数,这两个绑定方法在内存中也是不同的实体,所以用is判断对象身份时返回False。
验证与原始函数的关联
如果想确认这两个绑定方法确实关联同一个类函数,可以通过绑定方法的__func__属性验证:
print(foobar1.__func__ is foobar2.__func__) # 输出True print(foobar1.__func__ is Foo.bar) # 输出True
这说明它们的底层逻辑确实是同一个类函数,但因为绑定了不同实例,所以本身是不同的绑定方法对象。
内容的提问来源于stack exchange,提问作者lamc
相关产品推荐
相关产品推荐

