假设我有:
class foo:
def bar(self):
pass
然后我创建一个类的实例,然后假设我将该方法保存在一个变量中:
x = foo().bar
垃圾回收器是否可以通过任何机会清理对象,因为我没有指向他,即使我指向的是它的方法?
foo().bar
创建一个foo
实例,然后创建一个绑定到该实例的bar
方法。只要有对方法对象的引用,该绑定就可以防止实例变成垃圾。
从理论上讲,实现可能会注意到bar
从未实际引用self
,因此它实际上不需要绑定。但是Python 3.6.3并没有做到这一点。可以使用__self__
属性访问实例。
x = foo().bar
print(x) # <bound method foo.bar of <__main__.foo object at 0x1042269e8>>
print(x.__self__) # <__main__.foo object at 0x1042269e8>