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

Will GC clean up my object if I point to a method in it?

假设我有:

class foo:
 def bar(self):
  pass

然后我创建一个 class 的实例, 然后假设我将方法保存在变量中:

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>