2012-08-17 40 views
2

在python中我想導出一個對象方法作爲一個普通函數。該對象將被關閉。 就像下面這個:python:作爲函數關閉對象的導出方法

from functools import partial 

class A(object): 
    def __init__(self,a): 
     self.a = a 

    def m(self,b): 
     return self.a+b 

    def exportm(self): 
     return lambda b,self=self: self.m(b) 
     #return partial(self.m,self=self) 

f = A(10).exportm() 

print f(5) 

這種運作良好,並打印15預期。但是,如果我用註釋行替換回報 - 拉姆達行會失敗給了以下錯誤:

TypeError: m() got multiple values for keyword argument 'self' 

據我所知,使用functools是不是訴諸lambda表達式清潔。所以我想知道如何在functools中使用部分或其他工具來完成此操作。

回答

6

self.m已經綁定,所以沒有必要通過self=self它。只需返回self.m即可。欲瞭解更多參數,使用partial(self.m, ...)

class A(object): 
    def __init__(self, a): 
     self.a = a 

    def m(self, b, c): 
     return self.a + b + c 

    def exportm(self): 
     return partial(self.m, 300) 

f = A(10).exportm() 
print f(5) 
+0

非常感謝,有效,看起來很乾淨。 – 2012-08-17 10:21:39

0

按照KISS principle。沒有必要使用某種讓你的代碼看起來更專業的東西。由於thg435已經表示return self.m會做。

您的代碼越簡單,就越容易理解它,無論是由您自己,當您在一個月或其他開發人員中閱讀代碼時。

+0

我同意:對於這個例子來說,它看起來像是總的矯枉過正,但那是因爲我將其剝離以顯示我的觀點。 – 2012-08-17 10:36:01