我有一个家长班:
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
构造函数,以改为使用bar
中定义的BaseClass
的默认值?
我尝试过:
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
可以提供我要寻找的行为,但似乎扩展性不高。有更好的方法吗?
答案 0 :(得分:1)
您可以改用变量参数:
class InheritedClass(BaseClass):
def __init__(self, x, y, *args, **kwargs):
super().__init__(True, *args, **kwargs)
self.x = x
self.y = y
答案 1 :(得分:1)
在签名中完全不公开父级的参数;只需将您收到的内容(如果有的话)传递给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)
答案 2 :(得分:0)
您的方法还不错,是的,也许有比我更好的方法,但这是我想出的办法,希望对您有所帮助。
示例:
class BaseClass:
def __init__(self, foo, bar=10):
self.foo = foo
self.bar = bar
class InheritedClass(BaseClass):
def __init__(self, x, y, bar=None):
super().__init__(True, bar=bar)
if bar is None: bar = self.bar
self.x = x
self.y = y