我有一些类接受其init参数的函数:
class A(object):
def __init__(self, some_var, some_function):
self.some_function = some_function
self.x = self.some_function(some_var)
我可以创建一个函数,将它传递给对象的一个实例,并使用pickle保存它:
import pickle as pcl
def some_function(x):
return x*x
a = A(some_var=2, some_function=some_function)
pcl.dump(a, open('a_obj.p', 'wb'))
现在我想在其他一些代码中打开这个对象。但是,我不想在使用此特定保存对象的每个文件中包含def some_function(x):
代码。
那么,最好的python实践是将外部函数作为参数传递给python对象然后保存对象,这样外部函数就可以在对象实例中“实现”,因此不必编写在每个使用保存对象的文件中?
编辑:让我澄清一下,我不想保存这个功能。我只想保存对象。我有任何优雅的方法来“组合”对象内部的外部函数,所以我可以将它作为参数传递,然后它“成为”该对象实例的一部分?
答案 0 :(得分:1)
您要问的最简单的方法是使用dill
模块。
您可以像这样转储对象的实例:
import dill
def f(x):
return x*x
class A(object):
def __init__(self, some_var, some_function):
self.some_function = some_function
self.x = self.some_function(some_var)
a = A(2, f)
a.x
# returns:
# 4
with open('a.dill', 'wb') as fp:
dill.dump(a, fp)
然后创建一个新的python实例,你可以使用:
重新加载它import dill
with open('a.dill', 'rb') as fp:
a = dill.load(fp)
a.x
# returns:
# 4
a.some_function(4)
# returns:
# 16
答案 1 :(得分:0)
如果你真的,真的想要这样做,可以使用Pickle所基于的Marshal模块。出于安全原因,故意无法进行酸洗功能。
在这个问题中你可能会发现很多信息: Is there an easy way to pickle a python function (or otherwise serialize its code)?