【发布时间】:2013-07-02 18:38:30
【问题描述】:
据我了解pickle,您可以在文件和项目之间发送对象,只要这些对象的类存在于两个命名空间中。我有两个将传递 Prime 对象的应用程序。
class Prime():
def __init__(self):
self.a = 1
def func(self):
print(self.a)
两个应用程序都以上述版本的Prime 开头。但是第一个应用程序将更改Prime 的功能,例如func 将print("hello world")。然后,第二个应用程序将通过 pickle 接收第一个版本的 Prime 并使用它:
Second.py:
i = Prime
i.func()
with open("temp.txt", "r") as text:
o = pickle.load(text)
o.func()
输出:
1
hello world
我的问题分为两部分。如果第二个应用程序在其命名空间中只有原始版本的Prime,它是否能够与第一个应用程序一起工作,只要类和方法名没有更改?如果是这样,我该如何更改 first 的 Prime.func 的功能?
【问题讨论】:
-
首先,您的意思是
i = Prime()? -
第二,你真的不能使用
pickle在不同的应用程序之间发送对象,这些应用程序具有不同的模块和具有相同名称的类,没有很多hacky 解决方法。即使您知道这通常是个坏主意,因为您确定在这种情况下不是这样,您是否特别询问如何针对您的特定情况执行这些 hacky 变通办法? -
最后,通常情况下,
pickle永远不会真正腌制function对象,只是 fully-qualified references to their names。解决这个问题的唯一方法是实现你自己的__reduce__和朋友,他们会做一些事情,比如腌制co_code和其他从头开始重建代码和功能所需的信息(并检查它是否适用于正确的 Python版本,就像 .pyc 文件一样)。如果这对你来说听起来像是希腊语,你甚至不应该考虑这个。
标签: python function python-2.7 function-pointers pickle