如果我指向其中的一个方法,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>
假设我有:
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>