Метод python __init__ в унаследованном классе

Я хотел бы дать дочернему классу дополнительные атрибуты, не требуя явного вызова нового метода. Итак, есть способ дать унаследованному классу метод типа __init__ который не переопределяет метод __init__ родительского класса?

Я написал код ниже, чтобы проиллюстрировать мой вопрос (отсюда и плохое обозначение атрибутов и т. Д.).

 class initialclass(): def __init__(self): self.attr1 = 'one' self.attr2 = 'two' class inheritedclass(initialclass): def __new__(self): self.attr3 = 'three' def somemethod(self): print 'the method' a = inheritedclass() for each in a.__dict__: print each #I would like the output to be: attr1 attr2 attr3 

спасибо

5 Solutions collect form web for “Метод python __init__ в унаследованном классе”

Насколько я знаю, это невозможно, однако вы можете вызвать метод init суперкласса, например:

 class inheritedclass(initialclass): def __init__(self): initialclass.__init__(self) self.attr3 = 'three' 

Просто позвоните родительскому __init__ используя super :

 class inheritedclass(initialclass): def __new__(self): self.attr3 = 'three' super(initialclass, self).__init__() 

Я настоятельно рекомендую следовать соглашениям об именах Python и начинать класс с прописной буквы, например InheritedClass и InitialClass . Это помогает быстро отличить классы от методов и переменных.

Прежде всего, вы смешиваете __init__ и __new__ , это разные вещи . __new__ не принимает экземпляр ( self ) в качестве аргумента, он принимает класс ( cls ). Что касается основной части вашего вопроса, то вам нужно использовать super чтобы вызывать суперкласс ' __init__ .

Ваш код должен выглядеть так:

 class initialclass(object): def __init__(self): self.attr1 = 'one' self.attr2 = 'two' class inheritedclass(initialclass): def __init__(self): self.attr3 = 'three' super(inheritedclass, self).__init__() 

Это невероятно просто. Определите новый метод __init__ и вызовите родительский __init__ в начале.

 # assuming a class Base, its __init__ takes one parameter x class Derived(Base): def __init__(self, x, y): # whatever initialization is needed so we can say Derived is-a Base super(Derived, self).__init__(x) # now, add whatever makes Derived special - do your own initialization self.y = y 

В Python 3 вам не нужно (и, следовательно, не рекомендуется, для простоты) явно наследовать от object или передавать класс и « self super .

Просто вызовите назначенный метод из init родителя, если он существует:

 class initialclass(): def __init__(self): self.attr1 = 'one' self.attr2 = 'two' if hasattr(self, 'init_subclass'): self.init_subclass() class inheritedclass(initialclass): def init_subclass(self): self.attr3 = 'three' 
  • классы python, которые ссылаются друг на друга
  • Когда лучше всего использовать класс в Python?
  • return on negative condition vs if block
  • Это хорошая идея использовать super () в Python?
  • unbound method должен быть вызван с экземпляром X в качестве первого аргумента (вместо этого используется экземпляр X)
  • Итерация над атрибутами объекта в python
  • Итерация над экземплярами объекта данного класса в Python
  • Разница между объектом и экземпляром в python?
  • Python - лучший язык программирования в мире.