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

时间:2008-11-29 12:21:47

标签: python function

我正在尝试在python中执行以下操作:

在名为foo.py的文件中:

# 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的文件中:     import foo

d = foo.data
d.fn(1,2,3)

但是,我收到以下错误:

  

TypeError:必须使用数据实例作为第一个参数调用未绑定方法f()(改为使用int实例)

我认为这是公平的 - python将d.myFunction视为一个类方法。但是,我希望它将它视为普通函数 - 所以我可以调用它而无需在myFunction定义中添加未使用的'self'参数。

所以问题是:

如何在不将函数绑定到该类的情况下将函数存储在类对象中?

4 个答案:

答案 0 :(得分:24)

data.fn = staticmethod(myFunction)

应该这样做。

答案 1 :(得分:1)

你能做的是:

d = foo.data()
d.fn = myFunction

d.fn(1,2,3)

这可能不是你想要的,但确实有用。

答案 2 :(得分:0)

这对我来说似乎毫无意义。为什么不在需要时调用myFunction?

通常,在Python中,我们使用这种命名空间的模块(与Java对比,你别无选择)。当然,myFunction在您定义它时已经绑定到模块名称空间。

It is discussed somewhat in the answers to this question.

答案 3 :(得分:0)

感谢Andre的回答 - 这么简单!

对于那些关心你的人,也许我应该包括整个问题的背景。无论如何它在这里:

在我的应用程序中,用户可以在python中编写插件。他们必须使用明确定义的参数列表定义一个函数,但我不想对它们强加任何命名约定。

因此,只要用户编写具有正确数量的参数和类型的函数,他们所要做的就是这样(记住,这是插件代码):

# 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的调用接受函数对象并将其设置在隐藏的类对象中(以及其他与插件配置相关的东西,这个例子已经有所简化)。当主应用程序想要运行该函数时,我使用runpy模块来运行插件代码,然后提取上面提到的类对象 - 这给了我配置数据和插件函数,这样我就可以干净地运行它(不会污染我的命名空间)。

对于不同的插件,整个过程会在同一输入上重复多次,对我来说似乎非常有用。