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

因此,在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的初始化指定参数,而在Child的初始化中仅指定其他参数。

我想做这样的事情:
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模式可以完成上述任务?

最佳答案

不管参数命名如何,“六个子类和大量参数”听起来都是一个问题。

我怀疑一点重构就可以剥离一些策略对象,这些对象将简化此层次结构并使 super 复杂的构造函数消失。

10-05 20:29
查看更多