gpt4 book ai didi

python - python中的构造函数特化

转载 作者:太空狗 更新时间:2023-10-30 02:00:48 25 4
gpt4 key购买 nike

类层次结构和构造函数是相关的。来自子类的参数需要传递给它们的父类。

所以,在 Python 中,我们最终得到这样的结果:

class Parent(object):
def __init__(self, a, b, c, ka=None, kb=None, kc=None):
# do something with a, b, c, ka, kb, kc

class Child(Parent):
def __init__(self, a, b, c, d, e, f, ka=None, kb=None, kc=None, kd=None, ke=None, kf=None):
super(Child, self).__init__(a, b, c, ka=ka, kb=kb, kc=kc)
# do something with d, e, f, kd, ke, kf

想象一下有十几个子类和大量参数。添加新参数变得非常繁琐。

当然可以完全放弃命名参数并使用 *args 和 **kwargs,但这会使方法声明不明确。

是否有一种模式可以在 Python (2.6) 中优雅地处理这个问题?

“优雅地”是指我想减少参数出现的次数。 a、b、c、ka、kb、kc 都出现了 3 次:在 Child 构造函数中,在对 Parent 的 super() 调用中,以及在 Parent 构造函数中。

理想情况下,我想为 Parent 的 init 指定一次参数,而在 Child 的 init 中只指定额外的参数。

我想做这样的事情:

class Parent(object):
def __init__(self, a, b, c, ka=None, kb=None, kc=None):
print 'Parent: ', a, b, c, ka, kb, kc

class Child(Parent):
def __init__(self, d, e, f, kd='d', ke='e', kf='f', *args, **kwargs):
super(Child, self).__init__(*args, **kwargs)
print 'Child: ', d, e, f, kd, ke, kf

x = Child(1, 2, 3, 4, 5, 6, ka='a', kb='b', kc='c', kd='d', ke='e', kf='f')

不幸的是,这不起作用,因为 4、5、6 最终分配给了 kd、ke、kf。

是否有一些优雅的 python 模式可以完成上述任务?

最佳答案

无论参数命名如何,“十几个子类和大量参数”听起来都是个问题。

我怀疑稍作重构就可以剥离一些Strategy 对象,从而简化这个层次结构并使 super 复杂的构造函数消失。

关于python - python中的构造函数特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1202711/

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