2016-11-24 79 views
1

我想編寫一個類函數,它將Signal對象作爲參數並返回其副本。然後我想用一個返回自變量副本的實例函數重載這個函數。我有下面的代碼:將自我對象傳遞給需要此類型的函數

@classmethod 
def copy(cls, arg): 
    if not isinstance(arg, Signal): 
     raise ValueError("Argument must be of type Signal") 
    result = Signal() 
    result.framerate = arg.framerate 
    return result 

def copy(self): 
    return FragmentsSignal.copy(self) 

Signal1 = Signal(100) 
Signal2 = signal1.copy() 

但調用該函數複製我的代碼後進入無限遞歸循環,並拋出這個網站作爲例外的名稱。我的問題是:

  1. 我是否正確使用python函數重載機制?

  2. 如何將*參數傳遞給類中的類函數?

+0

幀率是唯一的信號屬性?你是否希望它只複製一個屬性(如果將來會有更多的)或所有這些屬性? – Nf4r

+0

不,它不是。我簡化了代碼以使問題更清楚。 – IFeel3

回答

1

我是否正確地使用Python函數重載機制?

你不能有兩個同名的函數; Python不支持基於參數類型的重載。第二個函數的定義將覆蓋第一個函數的定義。

實質上,您一遍又一遍地調用非classmethod函數copy。你需要重命名其中的一個纔能有效地工作。

如何將*參數傳遞給類中的類函數?

我猜你的意思是self這裏;將self傳遞給另一個函數的做法與其他任何參數一樣(如您的FragmentsSignal.copy(self))。你的問題是,你被相似的名字引起的遞歸難倒了。

+0

這很公平。謝謝:) – IFeel3

+1

技術上你可以通過參數類型支持重載,['functools.singledsipatch'](https://docs.python.org/3/library/functools.html#functools.singledispatch)(雖然它需要一個小[工作](http://stackoverflow.com/a/24602374)說服它做一些有用的方法)。但無論如何,因爲我是迂腐,你的答案是一個OP需要:-) –