嘗試將類方法綁定到函數時出現錯誤。爲什麼?將類方法綁定到外部函數
def foo():
print "Hello world"
class something(object):
bar = foo
test = something()
test.bar()
TypeError: foo() takes no arguments (1 given)
而且,如果我無法修改foo
,我可以做到這一點從改編類定義中?
嘗試將類方法綁定到函數時出現錯誤。爲什麼?將類方法綁定到外部函數
def foo():
print "Hello world"
class something(object):
bar = foo
test = something()
test.bar()
TypeError: foo() takes no arguments (1 given)
而且,如果我無法修改foo
,我可以做到這一點從改編類定義中?
一個簡單的方法來做到這一點是包裹功能在裏面staticmethod
答:
class A():
bar = staticmethod(foo)
>>> test = A()
>>> test.bar()
Hello world
當您以這種方式調用類方法時,您會將類實例作爲第一個參數傳遞。 當您致電test.bar
實際上發生的更像是bar(test)
。你傳遞一個參數給方法。
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
說我不能修改'foo'(或者說我寧願不改變它的簽名)。我可以在班級定義內做這種改編嗎? – 2013-04-10 22:25:21
我編輯了我的答案來回答你的問題。 – srgerg 2013-04-10 22:30:14
太棒了。謝謝@srgerg。我愛Python。 – 2013-04-10 22:30:53
請記住,當蟒蛇類調用它的一個方法,它會在一傳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
謝謝。我已經更新了OP來澄清我正在尋找一種不需要修改'foo'的方法,而只需要修改類定義本身。 – 2013-04-10 22:26:52
@ user815423426編輯,可能有更好的方法,但這個工程,我想你可以添加儘可能多的不同功能,你想現在。 – Serdalis 2013-04-10 22:35:41
類方法都有類的實例的第一個參數。所以添加一個參數到你的功能,它會工作。
初始def創建一個名爲foo
的函數對象。由於它不在任何類中,所以它只是一個不帶任何參數的函數。賦值bar = foo
只是將新名稱test.bar
賦予同一個函數對象。然而,調用test.bar()
假定bar是類方法,並將對象test
作爲第一個參數傳遞給方法(通常稱爲self
)。您可以將其作爲與something.bar()
的靜態方法進行調用,而不會出現錯誤。
我很喜歡這個解決方案。我想這隻適用於如果我不需要訪問該函數內的實例(但這是我更新中假設的一部分) – 2013-04-10 22:33:25