3

我知道如果我推迟一个函数并将一些参数传递给它,该函数具有这些参数并且可以使用它们,但是作为实例对象一部分的函数(例如)可以访问其对象的变量吗?

class foo (object):
    def __init__ (self):
        self.bar = 42
    def do_work (self):
        self.bar += 1

baz = foo()
deferred.defer(baz.do_work)

我基本上必须为函数提供它需要作为参数的所有信息吗?
另外,如果对它的唯一引用是在延迟函数中,baz 会被丢弃吗?

4

1 回答 1

3

如果您传入一个实例方法,就像您在代码示例中一样,整个实例将被序列化并传递。您的对象引用的任何对象foo也将被序列化,依此类推。任何全局状态——例如,模块级和类级变量——都不会被保留,因此它将处于这些变量在任务执行的实例上的任何状态。

必要的数据在您调用时被序列化并发送到任务队列defer,因此如果这是您对 baz 的唯一引用,则 baz 的该副本将立即被垃圾收集。但是,这不会阻止延迟任务运行,因为它会在反序列化和执行任务时创建一个新实例。

于 2011-02-01T02:51:57.493 回答