在类继承中传递具有默认值的参数的最安全方法是什么?



>假设我有一些Python类:

class A:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z

现在,我想定义一个子类,其y值是默认设置的,例如值为 1。这个新类的唯一变化是这个默认值y,那么我想这个公式会起作用

class B(A):
def __init__(self, **kwargs):
y = kwargs.pop("y", 1)
assert y == 1
super.__init__(y=y, **kwargs)

在继承中传递默认值的经典形式是什么?

这取决于你想要什么。如果y不是1,您当前的代码会抛出错误,因此将其设为参数根本没有意义。只需做:

class B(A):
def __init__(self, *args, **kwargs):
super().__init__(*args, y=1, **kwargs)

这会将所有参数传递给A,无论是按位置传递还是作为关键字传递,并将y固定为1。如果您尝试将y传递给B,则会收到错误。

或者,如果您希望y默认1但仍能将其作为参数提供给B

class B(A):
def __init__(self, *args, y=1, **kwargs):
super().__init__(*args, y=y, **kwargs)

第二个代码示例不起作用。它需要关键字参数,与第一个样本相比,这令人惊讶,并且assert它需要y == 1,它不默认为它。还必须调用super

通常的方法(参数重新排序(是:

class B(A):
def __init__(self, x, z, y=1):
super().__init__(x, y, z)

或者无需重新排序:

class B(A):
def __init__(self, x, yz, z=None):
if z is None:
super().__init__(x, 1, yz)
else:
super().__init__(x, yz, z)

最新更新