Эффект def __init__(self, a='A', b='B', c='C', *args, **kwargs):
Изменение кода OP с помощью конструктора дочернего класса, имеющего указанную выше подпись:
class BaseClass(object):
def __init__(self, *args, **kwargs):
self.args = args
for k, v in kwargs.items():
setattr(self, k, v)
class ClassA(BaseClass):
def __init__(self, *args, **kwargs):
super(ClassA, self).__init__(*args, **kwargs)
class ClassB(ClassA):
def __init__(self, a='A', b='B', c='C', *args, **kwargs):
self.a = a
self.b = b
self.c = c
super(ClassA, self).__init__(*args, **kwargs)
A = ClassA('hello', 'world', myname='hal',myemail='[email protected]')
B = ClassB('hello', 'world', myname='hal', myemail='[email protected]')
print("CLASS A:", A.__dict__)
print("CLASS B:", B.__dict__)
# yields the following:
CLASS A: {'args': ('hello', 'world'), 'myname': 'hal', 'myemail': '[email protected]'}
CLASS B: {'args': (), 'myname': 'hal', 'a': 'hello', 'myemail': '[email protected]', 'c': 'C', 'b': 'world'}
Код не будет генерировать исключение, однако a, b и c теперь позиционно являются первыми тремя аргументами, переданными методу (игнорируя self
) , как видно из двух объектов dicts.
Доступ к атрибутам a, b и c показывает этот другой эффект
>>> B.a # expect to see 'A'
'hello'
>>> B.b # similarly
'world'
>>> B.c # but this retails the default value
'C'
Насколько мне известно, вы не можете добавлять в сигнатуру метода только аргументы нового ключевого слова. Пожалуйста, поправьте меня, если я ошибаюсь.
Однако и @aknuds1, и @Oleh Prypin предоставили решения, которые эффективно добавляют новые аргументы ключевого слова в дочерний класс. Решение Олега немного умнее, но мне проще понять версию aknuds1.
- всплывающие элементы из словаря
kwargs
, объединенные со значением по умолчанию
- присвоить атрибуту экземпляра с помощью
setattr
- вызвать родительский конструктор с аргументами, kwargs
person
Haleemur Ali
schedule
14.12.2014
class Derived(Base): def meth (self): super(Derived, self).meth()
Любая конкретная причина, по которой вы не следуете этому пути. - person kvivek   schedule 14.12.2014