【发布时间】:2012-11-10 06:48:31
【问题描述】:
是否有可能创建 Python 函数的真实副本?最明显的选择是http://docs.python.org/2/library/copy.html,但我读到了:
它确实“复制”函数和类(浅层和深层),通过 原样返回原对象;
我需要一个真实的副本,因为我可能会更改函数的某些属性。
更新:
我知道 cmets 中提到的所有可能性。我的用例基于元编程,我根据一些声明性规范构造类。完整的细节对于 SO 来说太长了,但基本上我有一个类似的功能
def do_something_usefull(self,arg):
self.do_work()
我会将这个方法添加到各种类中。这些类可以完全不相关。使用 mixin 类不是一种选择:我将拥有许多这样的函数,并且最终会为每个函数添加一个基类。我目前的“解决方法”是将这个函数包装在这样的“工厂”中:
def create_do_something():
def do_something_usefull(self,arg):
self.do_work()
这样我总能得到一个新的 do_something_useful 函数,但我必须像这样包装我的所有函数。
您可以相信我,我知道,这不是“正常”的 OO 编程。我知道如何“正常”地解决这样的问题。但这是一个动态代码生成器,我希望一切都尽可能轻量和简单。而且由于python函数是很普通的对象,我觉得问怎么复制也不会太奇怪!?
【问题讨论】:
-
如果你真的必须使用
copy.deepcopy。但我认为某处存在更深层次的设计缺陷。首先为什么要复制函数? -
您能帮我们了解一下您想要做什么——您的问题有点奇怪/含糊。在我编写的数千行python中,我从未复制过一个函数。
-
如果你需要维护状态,为什么不使用类和实例呢?为什么函数需要以某种方式复制?
-
如果要更改函数的属性,最好将函数包装在对象中,然后更改对象的属性。它会让你的代码更干净。如果向对象添加
__call__方法,则可以像函数一样调用它。 -
我不明白为什么在 python 中像对待任何其他对象一样处理函数应该是一个问题。我确实有同样的需求:装饰函数被传递给期望函数对象的内部和外部代码。复制一个函数来改变它的装饰因此很有用,而使用看起来像函数但不是的对象只是过于复杂。