python - 更改子类中的默认构造函数参数值(从父类继承)

标签 python constructor arguments subclass

我有一个 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/

相关文章:

c++ - 理解构造函数抛出的异常

python - Bottle - 是否可以在没有参数的情况下检索 URL?

python - 如何传递文件名的路径

Python/Matplotlib - 调整绘图边缘与 x 轴之间的间距

java - 创建子类时是否需要 super ?

c++ - 如何使用构造函数初始化另一个类中的对象?

java - 接受未定义数量的数组的方法

python - 参数与参数 Python

python - 将列表的每个元素传递给在 Python 中采用多个参数的函数?

python - 从 numpy 数组 float32 到 numpy 数组 float64 的转换