在类对象中存储未绑定的python函数

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)

"打电话到setPluginFunction需要的功能和它在对象集J的隐类对象(沿与其他plugin -配置相关的东西,这已经有点简化的例子)。当主要应用想要运行的功能,我用的runpy模块的运行的plugin代码,然后提取物的类对象mentioned以上-这给我的配置数据和功能的plugin所以我可以运行它cleanly(没有我的polluting命名空间)。 P / < >

这整个过程,也为多个不同的时代--反复plugins在同样的输入,和似乎工作的很好,给我的。 P / < >


这似乎pointless给我。为什么不打电话myfunction只是当你需要它吗? P / < >

在一般,在Python模块,我们使用为这种namespacing(contrast这与Java在哪里,你只是没有选择)。和当然,myfunction也已经结合到模块命名空间,当你定义它。 P / < >

它也有点discussed在回答到这个问题。 P / < >