gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:04:46 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com