Method overloading in Python: more overloading
这个问题不是另一个重载问题的副本,因为我正试图在函数中引用
所以我有一个方法,
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) |
号
我该怎么做?在其他语言中,我可以定义一个访问内部变量的第二个
目前,我有一个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) |
。
不确定我是否完全按照您的问题来做,但通常的模式是使用
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 ... |
您可以通过使用
1 2 3 4 | def foo(self, position, a=None, b=None, ...): a = a or self.a b = b or self.b ... |
号
但是,如果你试图传递像
您可以给这些参数一个默认值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 |