gpt4 book ai didi

python - 如何让子类使用父类的默认值?

转载 作者:行者123 更新时间:2023-12-01 01:00:33 26 4
gpt4 key购买 nike

我有一个父类:

class BaseClass:
def __init__(self, foo, bar=10):
self.foo = foo

以及从中继承的类:

class InheritedClass(BaseClass):
def __init__(self, x, y, bar=10):
super().__init__(True, bar=bar)
self.x = x
self.y = y

目前,bar 在父类和继承类中都有一个默认值,我必须跟踪它以确保它们都同步。如何更改 InheritedClass 构造函数以改为使用 BaseClass 中定义的 bar 的默认值?

<小时/>

我已经尝试过:

class InheritedClass(BaseClass):
def __init__(self, x, y, bar=None):
if bar is None:
super().__init__(True)
else:
super().__init__(True,bar)
self.x = x
self.y = y

它提供了我正在寻找的行为,但似乎不太可扩展。有更好的办法吗?

最佳答案

不要在签名中暴露父级的论点;只需将您收到的内容(如果有的话)传递给 MRO 中的下一个类。

class BaseClass:
def __init__(self, foo, bar=10, **kwargs):
super().__init__(**kwargs)
# Do something with bar
self.foo = foo


class InheritedClass(BaseClass):
def __init__(self, x, y, **kwargs)
kwargs['foo'] = True
super().__init__(**kwargs)
self.x = x
self.y = y

无论如何,您都必须接受并传递任意关键字才能正确使用 super,因此您也可以对父类的参数执行相同的操作,即使您已经“知道”它们。

这也意味着始终使用__init__关键字参数,因为您无法真正预测类的位置参数将如何与MRO上的另一个类交互。 (位置参数只能按照先到先得的原则使用,并且在多重继承的情况下,您根本不知道何时调用您的类的方法。)

foo = InheritedClass(bar=9, x=3, y=10)

关于python - 如何让子类使用父类的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55835587/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com