Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重写方法时,说明(无关)参数的首选方式是什么?_Python_Oop - Fatal编程技术网

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)
    
    等等