storing unbound python functions in a class object
我尝试在python中执行以下操作:
在名为foo.py的文件中:
1 2 3 4 5 6 7 8 9 10 | # simple function that does something: def myFunction(a,b,c): print"call to myFunction:",a,b,c # class used to store some data: class data: fn = None # assign function to the class for storage. data.fn = myFunction |
然后在一个名为bar.py的文件中:进口货
1 2 | d = foo.data d.fn(1,2,3) |
但是,我得到以下错误:
TypeError: unbound method f() must be called with data instance as first argument (got int instance instead)
我想这已经足够公平了——python将d.myfunction作为一个类方法来处理。但是,我希望它将其视为一个普通函数-因此我可以调用它,而不必向MyFunction定义中添加一个未使用的"self"参数。
所以问题是:
如何在类对象中存储函数而不将函数绑定到该类?
1 | data.fn = staticmethod(myFunction) |
应该做的伎俩。 P / < >
你可以做什么: P / < >
1 2 3 4 | d = foo.data() d.fn = myFunction d.fn(1,2,3) |
这可能不是你想要的到底是什么,但确实工作。 P / < >
谢谢到安德烈*回答如此简单! P / < >
对于那些你谁在乎,也许我应该拥有的都包括整个上下文的问题。这会怎样: P / < >
在我的应用程序,用户是能的到写plugins在Python。他们必须定义的功能与好的parameter定义的列表,但我不想给它的任何impose公约在他们。 P / < >
所以,只要用户写的,功能是的先生与数的参数和类型,他们所要做的是这样的(记住,这就是plugin code): P / < >
1 2 3 4 5 6 7 8 9 10 11 | # this is my custom code - all plugins are called with a modified sys.path, so this # imports some magic python code that defines the functions used below. from specialPluginHelperModule import * # define the function that does all the work in this plugin: def mySpecialFn(paramA, paramB, paramC): # do some work here with the parameters above: pass # set the above function: setPluginFunction(mySpecialFn) |
"打电话到
这整个过程,也为多个不同的时代--反复plugins在同样的输入,和似乎工作的很好,给我的。 P / < >
这似乎pointless给我。为什么不打电话myfunction只是当你需要它吗? P / < >
在一般,在Python模块,我们使用为这种namespacing(contrast这与Java在哪里,你只是没有选择)。和当然,myfunction也已经结合到模块命名空间,当你定义它。 P / < >
它也有点discussed在回答到这个问题。 P / < >