我正在尝试在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'参数。
所以问题是:
如何在不将函数绑定到该类的情况下将函数存储在类对象中?
答案 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在您定义它时已经绑定到模块名称空间。
答案 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
模块来运行插件代码,然后提取上面提到的类对象 - 这给了我配置数据和插件函数,这样我就可以干净地运行它(不会污染我的命名空间)。
对于不同的插件,整个过程会在同一输入上重复多次,对我来说似乎非常有用。