2015-12-12 91 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