更改子类中的默认构造函数自变量值(从父类继承)

库尔特·鲍巴基

我有一个Parent带有默认值class属性arg2我想创建一个Child具有相同属性默认值的默认值的子类我需要使用*args**kwargsChild

我尝试了以下操作,但不起作用:

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'
马丁·彼得斯(Martijn Pieters)

您需要在将默认值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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章