我有一个Parent
带有默认值的class属性arg2
。我想创建一个Child
具有相同属性默认值的默认值的子类。我需要使用*args
和**kwargs
中Child
。
我尝试了以下操作,但不起作用:
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'
您需要在将默认值kwargs
传递给super()
;之前将其设置为; 这很棘手,因为您需要确保尚未包含相同的值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__
在一般情况下,您必须对此进行自省:
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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句