Иерархии классов и конструкторы связаны между собой. Параметры из дочернего класса должны быть переданы их родителю.
Итак, в 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, в вызове super () для Parent и в конструкторе Parent.
В идеале я бы хотел указать параметры для init Родителя один раз, а для 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 для выполнения вышесказанного?