Python 重写方法时,说明(无关)参数的首选方式是什么?
假设此代码:Python 重写方法时,说明(无关)参数的首选方式是什么?,python,oop,Python,Oop,假设此代码: class A: def foo(self, bar, baz=None, *args, **kwargs): ... # Do some stuff with using bar, baz, args and kwargs return result class B(A): def foo(self, *args, **kwargs): ... # Not using bar or baz ret
class A:
def foo(self, bar, baz=None, *args, **kwargs):
... # Do some stuff with using bar, baz, args and kwargs
return result
class B(A):
def foo(self, *args, **kwargs):
... # Not using bar or baz
return super().foo(*args, **kwargs)
class C(A):
def foo(self, bar, baz=None, *args, **kwargs):
... # Not using bar or baz
return super().foo(bar, baz, *args, **kwargs)
如您所见,有两种方法重写
foo
。类C显式地声明参数,而类B只是将它们放入*args
和*kwargs
中。两者都很好。我想,如果我要使用baz
和bar
,我会明确地声明它们,因为它们可以提高可读性,并保存字典/列表调用。但如果我不使用它们,我认为将它们包装成*args
和**kwargs
应该可以。有什么更好的方法和理由吗?你明白了。如果您不使用bar
/baz
,请不要接受它们,只需将它们作为args
/kwargs
的一部分传递,而不用自己处理它们
(请参阅“实用建议”一节),特别是在更复杂的继承场景中,就是根本不接受*args
(除非您确实需要接受可变位置参数,而不是懒得声明您父母所需的已知固定数量的参数)并使每层仅接受:
**kwargs
)super()
dispatch进行许多调用的开销很小,而且很清楚哪些参数正在传递,哪些参数没有传递。因此,对于您的代码,您只需执行以下操作:
class A:
def foo(self, bar, baz=None, **kwargs):
... # Do some stuff with using bar, baz, and kwargs
return result
class B(A):
def foo(self, **kwargs):
... # Not using bar or baz
return super().foo(**kwargs)
class C(A):
# ... same as B aside from omitted code
呼叫者通过以下方式呼叫:
instance.foo(bar=1)
instance.foo(bar=2, baz=3)
等等