2008-11-29 49 views
15

我试图做蟒蛇以下:存储类对象绑定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 : 进口富

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'参数。

所以,问题是:

我怎么能存储在无功能的类对象的功能变得绑定到类?

+0

我想你打算使用:d.fn(1,2,3)而不是d.myFunctions(1,2,3) – 2008-11-29 13:35:09

+0

是的,我认为你的意思是d.fn() – hop 2008-11-29 13:44:19

+1

解决方案如下,但你为什么要这样? – orip 2008-11-29 20:26:52

回答

23
data.fn = staticmethod(myFunction) 

应该做的伎俩。

+0

这是正确的答案和语法,因为函数是在别处定义的。 – tzot 2008-11-29 14:41:26

0

这对我来说似乎毫无意义。为什么不在需要时调用myFunction?一般来说,在Python中,我们使用模块来处理这种类型的命名空间(与Java对比,你只是没有选择)。当然,定义它时,myFunction已经绑定到模块名称空间。

It is discussed somewhat in the answers to this question.

1

你可以做的是:

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

d.fn(1,2,3) 

这可能不是你想要什么,但没有工作。

0

感谢安德烈的答案 - 太简单了!

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

在我的应用程序中,用户可以在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模块运行插件代码,然后提取上面提到的类对象 - 这给了我配置数据和插件功能,所以我可以干净地运行它(不会污染我的命名空间)。

这整个过程被重复用于不同的插件多次在相同的投入,似乎工作对我非常好。