Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 延迟库允许打包函数访问多少信息?_Python_Oop_Google App Engine_Deferred Execution - Fatal编程技术网

Python 延迟库允许打包函数访问多少信息?

Python 延迟库允许打包函数访问多少信息?,python,oop,google-app-engine,deferred-execution,Python,Oop,Google App Engine,Deferred Execution,我知道如果我延迟一个函数并向它传递一些参数,该函数就有这些参数并且可以使用它们,但是作为实例化对象一部分的函数(例如)可以访问其对象的变量吗 class foo (object): def __init__ (self): self.bar = 42 def do_work (self): self.bar += 1 baz = foo() deferred.defer(baz.do_work) 基本上,我必须给函数提供它作为参数所需的所有信息

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

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

baz = foo()
deferred.defer(baz.do_work)
基本上,我必须给函数提供它作为参数所需的所有信息吗?

此外,如果baz的唯一引用是在延迟函数中,它会被丢弃吗?

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


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

因此,为了确保我完全理解,请重申:deferred.defer(baz.do_work)导致整个baz实例被“保存”(序列化),即使只调用了一个函数。baz可能会被丢弃,但在执行时会从任务的“已保存”数据中“加载”。这真是个奇迹,没错。有关详细信息,请查看Python
pickle
模块。