如果我指向对象中的一个方法,GC会清理它吗



假设我有:

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>

最新更新