2015-12-12 133 views
1

這個問題不是其他重載問題的重複,因爲我試圖在函數中引用self.args。在這個問題中給出的答案不能滿足,因爲如果我實現了這個答案,我會得到一個錯誤。但是,在其他語言中,這很容易通過方法重載來完成......所以這個問題與另一個問題高度相關。在Python中重載方法:更重載

所以我有一個方法,

class learner(): 
     def train(a ton of arguments): 
      self.argA = argA, 
      etc. 

我想打電話給列車只有一個值,並將它使用所有自調用來填充其他參數...但它是一個圓形的引用python似乎不支持。理想情況下,我會寫:

class learner(): 
    def train(self, position, data = self.data, alpha = self.alpha, beta = etc): 
      ...do a bunch of stuff 

    def roll_forward(self,position): 
      self.alpha += 1 
      self.beta += 1 
      self.train(position) 

我該怎麼做?在其他語言中,我可以定義訪問的內部變量第二train功能...

目前

,我有一個janky黑客在那裏我這樣做:

class learner(): 
    def train(...): 
      .... 
    def train_as_is(self,position): 
     self.train(position,self.alpha,self.beta, etc.) 

但是,這是一個相當大的類和一噸這樣的功能是把我的代碼放入麪條...

+0

可能重複的[如何在Python中使用方法重載?](http://stackoverflow.com/questions/10202938/how-do-i-use-method-overloading- in-python) –

+0

不,不是重複的。我其實是回答了這個問題。不知道你明白我想要做什麼。 – bordeo

+0

參數默認值在模塊加載時進行評估。所以即使你沒有自引用的問題,代碼也不會做你想要的,因爲'self.alpha'的修改不會影響train()的默認值。 – NEOatNHNG

回答

6

對其他答案的改進是使用默認字典:

def train(self, position, **kwargs): 
    defaults = { 
     'a': self.a, 
     'b': self.b, 
     ...etc... 
    } 
    defaults.update(kwargs) 
    ... do something with defaults 

def roll_forward(self,position): 
     self.alpha += 1 
     self.beta += 1 
     self.train(position) 
+0

我喜歡這個。多謝,夥計。 – bordeo

+0

這有風險,您可以使用額外的關鍵字參數來調用它,但不會期望... – Copperfield

+0

爲true。去考慮它。 – bordeo

4

不知道如果我按照你的問題100%,但通常的模式是使用None作爲默認值:

class Foo(object): 
    def __init__(self): 
     self.a = ... 
     self.b = ... 
     ... 

    def foo(self, position, a=None, b=None, ...): 
     if a is None: 
      a = self.a 
     if b is None: 
      b = self.b 
     ... 

可以簡化使用or

def foo(self, position, a=None, b=None, ...): 
    a = a or self.a 
    b = b or self.b 
    ... 

然而,是不是在情況下,可靠的,你會嘗試通過falsy值一樣0or部分將在

+0

不,我沒忘記。它應該是'如果a是None',因爲你想檢查它的None,你想默認'a'到'self.a'。 – miki725

1

踢你可以給這些參數默認值爲None,然後檢查它們中的任何一個是否爲None,如果是,則分配所需的值,像這樣

class learner(): 
    def train(self, position, data = None, alpha = None, beta = None,etc...): 
     if data is None: 
      data = self.data 
     if alpha is None: 
      alpha = self.alpha 
     ...etc 
     ...do a bunch of stuff 
+0

這個看起來不錯。只會提出最初的訓練來訓練複雜。 – bordeo