2008-09-15 108 views
1

我想做一個子類,它有一個父類的方法,其中的方法是子類中的'classmethod',但是父類中的不是裝飾父類方法

從本質上講,我試圖完成以下任務:

class foo(Object): 
    def meth1(self, val): 
     self.value = val 

class bar(foo): 
    meth1 = classmethod(foo.meth1) 

回答

3

我也不完全確定你想要的確切行爲是什麼,但假設你想讓bar.meth1(42)等同於foo.meth1是bar的一個classmethod(用「self」作爲

def convert_to_classmethod(method): 
    return classmethod(method.im_func) 

class bar(foo): 
    meth1 = convert_to_classmethod(foo.meth1) 

與類方法(foo.meth1的問題)是foo.meth1已經轉換的方法,與第一個參數有特殊的含義:類),那麼你就可以達致這。你需要撤消這個並查看底層函數對象,重新解釋「自我」的含義。

我也會提醒,這是一件非常奇怪的事情,因此很容易導致任何人閱讀代碼時感到困惑。你可能會更好地考慮解決你的問題。

3

什麼是你想實現什麼?如果我在實時Python代碼中看到這樣的構造,我會考慮擊敗原始程序員。

0

提出的這個問題對我來說似乎很奇怪:我看不出爲什麼有人會這樣做。您可能誤解了Python中的「classmethod」(它與Java中的靜態方法有點不同)。

一個正常的方法或多或少只是一個函數,它的第一個參數(通常稱爲「self」),該類的一個實例,以及被調用爲「。」。

classmethod或多或少只是一個函數,它將第一個參數(通常稱爲「cls」)作爲一個類,它可以作爲「。」調用。或稱爲「。」。

考慮到這一點,以及上面顯示的代碼,如果有人創建了bar的實例並調用meth1,您會發生什麼情況?

bar1 = bar() 
bar1.meth1("xyz") 

當調用meth1的代碼時,會傳遞兩個參數'self'和'val'。我想你會期待「xyz」被傳遞給'val',但是你在想什麼會被'自我'傳遞?它應該是bar1實例(在這種情況下,不需要覆蓋)?或者應該是班級吧(這個代碼會做什麼)?