python - python中的构造函数特化

标签 python design-patterns class oop anti-patterns

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

所以,在 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/

相关文章:

python - 即使在设置 SLUGIFY_USES_TEXT_UNIDECODE 和 AIRFLOW_GPL_UNIDECODE 后也无法安装 Airflow

java - 基于多个参数返回结果的模式

php - 服务定位器、依赖注入(inject)(和容器)和控制反转

javascript - 使用 javascript 获取和编辑元素的 css 类

Python - 弹出MsgBox后继续执行代码?

python - 如何使用 Pandas 将二维表 (DataFrame) 反转为一维列表?

python - 创建分组比例向量而不丢失行

java - 使用B类对象创建B类对象

objective-c - 为什么是 KindOfClass :[NSHTTPURLResponse self] instead of isKindOfClass:[NSHTTPURLResponse class]?

ruby-on-rails - 如何替换 Rails 控制台中的现有类?