2013-04-10 39 views
2

嘗試將類方法綁定到函數時出現錯誤。爲什麼?將類方法綁定到外部函數

def foo(): 
    print "Hello world" 

class something(object): 
    bar = foo 

test = something() 
test.bar() 

TypeError: foo() takes no arguments (1 given) 

而且,如果我無法修改foo,我可以做到這一點從改編類定義中?

回答

7

一個簡單的方法來做到這一點是包裹功能在裏面staticmethod答:

class A(): 
    bar = staticmethod(foo) 

>>> test = A() 
>>> test.bar() 
Hello world 
+0

我很喜歡這個解決方案。我想這隻適用於如果我不需要訪問該函數內的實例(但這是我更新中假設的一部分) – 2013-04-10 22:33:25

1

當您以這種方式調用類方法時,您會將類實例作爲第一個參數傳遞。 當您致電test.bar實際上發生的更像是bar(test)。你傳遞一個參數給方法。

2

python中的類方法總是至少需要一個參數,通常稱爲self。這個例子是從official Python tutorial採取:

# Function defined outside the class 
def f1(self, x, y): 
    return min(x, x+y) 

class C: 
    f = f1 
    def g(self): 
     return 'hello world' 
    h = g 

注意,這兩種方法,而不管它們是否是類的外部或內部定義,採取self作爲一個參數。

編輯:如果你真的不能改變你的foo功能,那麼你可以做這樣的事情:

>>> def foo(): 
...  print "Hello World" 
... 
>>> class something(object): 
...  def bar(self): foo() 
... 
>>> test = something() 
>>> test.bar() 
Hello World 
+0

說我不能修改'foo'(或者說我寧願不改變它的簽名)。我可以在班級定義內做這種改編嗎? – 2013-04-10 22:25:21

+1

我編輯了我的答案來回答你的問題。 – srgerg 2013-04-10 22:30:14

+1

太棒了。謝謝@srgerg。我愛Python。 – 2013-04-10 22:30:53

1

請記住,當蟒蛇類調用它的一個方法,它會在一傳self的說法。你需要在你的代碼,以說明:

​​

您可以閱讀所有關於在Python Documentation

最簡單的解決方法類不傳遞一個self,我能想到的是:

def foo(): 
    print ("Hello world") 

class something(object): 
    bar = [foo] # contains pointer to static method 

test = something() 
test.bar[0]() # calls the static method 
+0

謝謝。我已經更新了OP來澄清我正在尋找一種不需要修改'foo'的方法,而只需要修改類定義本身。 – 2013-04-10 22:26:52

+0

@ user815423426編輯,可能有更好的方法,但這個工程,我想你可以添加儘可能多的不同功能,你想現在。 – Serdalis 2013-04-10 22:35:41

1

類方法都有類的實例的第一個參數。所以添加一個參數到你的功能,它會工作。

1

初始def創建一個名爲foo的函數對象。由於它不在任何類中,所以它只是一個不帶任何參數的函數。賦值bar = foo只是將新名稱test.bar賦予同一個函數對象。然而,調用test.bar()假定bar是類方法,並將對象test作爲第一個參數傳遞給方法(通常稱爲self)。您可以將其作爲與something.bar()的靜態方法進行調用,而不會出現錯誤。