2008-11-29 92 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模塊運行插件代碼,然後提取上面提到的類對象 - 這給了我配置數據和插件功能,所以我可以乾淨地運行它(不會污染我的命名空間)。

這整個過程被重複用於不同的插件多次在相同的投入,似乎工作對我非常好。