English 中文(简体)
将未绑定的Python函数存储在类对象中
原标题:
  • 时间:2008-11-29 12:21:47
  •  标签:

我正在尝试用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

And then in a file called bar.py: import foo

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

然而,我收到以下错误:

错误类型:未绑定的方法f()必须以data实例作为第一个参数进行调用(而不是int实例)。

我想这还算是公平的——Python把d.myFunction当作类方法来对待。然而,我想让它把它看作普通函数——这样我就可以在不必添加未使用的 self 参数到myFunction定义中的情况下调用它。

所以问题是:

如何将函数存储在类对象中,而不使函数被绑定到该类?

最佳回答
data.fn = staticmethod(myFunction)

应该行得通。

问题回答

您可以做的是:

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

d.fn(1,2,3)

这可能不是您想要的,但确实起作用。

感谢安德烈的答案 - 如此简单!

对于关心这个问题的人,也许我应该包含整个问题的背景。不过,这是它的完整内容:

在我的应用中,用户可以用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模块来运行插件代码,然后提取上述类对象 - 这样我就可以干净地运行它(而不会污染我的命名空间)。

这个整个过程针对不同插件在相同输入上重复多次,对我来说似乎非常有效。





相关问题
热门标签