在以下Python代码中:
class Foo:
def bar(self):
return 1
def baz():
return Foo()
print baz().bar()
0 问题:
当bar()
在print baz().bar()
中求值时,是什么使得baz()
返回的Foo
实例还没有被垃圾收集,因为似乎没有对它的引用,就像在:
foo = baz()
print foo.bar()
where foo
存储Foo
实例的引用。
问题1:
如果Foo和baz是在Python扩展模块中用C实现的,baz
应该增加返回对象foo
的引用计数以将其设置为1吗?
答案0:当bar()
被调用时,bar是一个绑定方法(绑定到Foo
实例),它保持对其self
参数的引用,即Foo
实例。
对于第0部分:每次调用baz时,它都会创建一个新对象Foo。您可以通过在Foo中添加一个init来看到这一点。因此,在打印之前,Foo实例不存在。(它不是在声明函数baz时创建的,而是在调用它时创建的。
第1部分:与0一样,声明baz()并不创建对象。调用baz()可以。当每次调用函数baz时调用'Foo()'(构造函数)时,引用计数递增。