Python中的方法重载:更多重载

Method overloading in Python: more overloading

这个问题不是另一个重载问题的副本,因为我正试图在函数中引用self.args。在那个问题中给出的答案不满足,因为如果我实现那个答案,我将得到一个错误。但是,在其他语言中,这很容易通过方法重载来实现……因此这个问题与其他问题高度相关。

所以我有一个方法,

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

我只想用一个值来调用train,并让它使用所有的自调用来填充其他参数……但这是一个Python似乎不支持的循环引用。理想情况下,我会写:

1
2
3
4
5
6
7
8
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黑客,我在那里做这个:

1
2
3
4
5
class learner():
     def train(...):
             ....
     def train_as_is(self,position):
         self.train(position,self.alpha,self.beta, etc.)

但这是一个相当大的类,大量这样的函数正在把我的代码变成意大利面条…


其他答案的增强功能是使用默认字典:

1
2
3
4
5
6
7
8
9
10
11
12
13
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)


不确定我是否完全按照您的问题来做,但通常的模式是使用None作为默认值:

1
2
3
4
5
6
7
8
9
10
11
12
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来简化:

1
2
3
4
def foo(self, position, a=None, b=None, ...):
    a = a or self.a
    b = b or self.b
    ...

但是,如果你试图传递像0这样的错误值,那么这就不那么可靠了。or部分将开始


您可以给这些参数一个默认值none,然后检查它们中是否有一个是none,如果是的话,就这样分配所需的值。

1
2
3
4
5
6
7
8
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