>假设我有一些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)