我有一个 Parent
类,其属性 arg2
具有默认值。我想创建一个子类 Child
,它对同一属性具有不同的默认值。
我需要在 Child
中使用 *args
和 **kwargs
。
我尝试了以下方法,但它不起作用:
class Parent(object):
def __init__(self, arg1='something', arg2='old default value'):
self.arg1 = arg1
self.arg2 = arg2
print('arg1:', self.arg1)
print('arg2:', self.arg2)
class Child(Parent):
def __init__(self, *args, **kwargs):
super(Child, self).__init__(*args, **kwargs)
self.arg2 = kwargs.pop('arg2', 'new value')
这是行不通的。事实上,我得到:
>>> c = Child()
arg1: something
arg2: default value # This is still the old value
>>> c.arg2
'new value' # Seems more or less ok
>>> c = Child('one', 'two')
arg1: one
arg2: two
>>> c.arg2
'new value' # This is wrong, it has overridden the specified argument 'two'
最佳答案
在传递给 super()
之前,您需要在 kwargs
中设置默认值;这很棘手,因为您需要确保 args
中也没有相同的值:
class Child(Parent):
def __init__(self, *args, **kwargs):
if len(args) < 2 and 'arg2' not in kwargs:
kwargs['arg2'] = 'new value'
super(Child, self).__init__(*args, **kwargs)
然而,这取决于知道有多少参数需要填充。你必须使用 super().__init__
的自省(introspection)才能在一般情况下工作:
from inspect import getargspec
class Child(Parent):
def __init__(self, *args, **kwargs):
super_init = super().__init__
argspec = getargspec(super_init)
arg2_index = argspec.args.index('arg2') - 1 # account for self
if len(args) < arg2_index and 'arg2' not in kwargs:
kwargs['arg2'] = 'new value'
super(Child, self).__init__(*args, **kwargs)
您最好指定所有默认值:
class Child(Parent):
def __init__(self, arg1='something', arg2='new value'):
super(Child, self).__init__(arg1=arg1, arg2=arg2)
关于python - 更改子类中的默认构造函数参数值(从父类继承),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41623464/