对于CPython,函数对象只有一个副本。在实例创建期间,类将其命名空间中的未绑定函数包装为绑定方法。但它们都有相同的功能。
下面是您的示例,它将显示发生了什么。class A(object):
def __init__(self, flag):
self.flag = flag
def func(self):
print self.flag
a = A(1)
b = A(2)
callback_a = a.func
callback_b = b.func
print "typeof(callback_a) = {0}".format(type(callback_a))
print "typeof(callback_b) = {0}".format(type(callback_b))
print "typeof(callback_a.__func__) = {0}".format(type(callback_a.__func__))
print "typeof(callback_b.__func__) = {0}".format(type(callback_b.__func__))
print "'callback_a.__func__ is callback_b.__func__' is {0}".format(callback_a.__func__ is callback_b.__func__)
callback_a()
callback_b()
此代码输出typeof(callback_a) =
typeof(callback_b) =
typeof(callback_a.__func__) =
typeof(callback_b.__func__) =
'callback_a.__func__ is callback_b.__func__' is True
使用is运算符可以清楚地看到,两个instancemethod类共享同一个函数对象。