Метод 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
  • Шаблон Python для отказа от реализации класса «grandparent»
  • Как поймать любой метод, вызываемый объектом в python?
  • Добавление перегрузки в поведении Python x + y vs y + x
  • Инициализация модуля Python
  • Прикрепление декоратора ко всем функциям внутри класса
  • Что такое метод __del__, Как его называть?
  • Python __init__ и сам, что они делают?
  • Как метод python автоматически получает «я» в качестве первого аргумента?
  •  
    Interesting Posts for Van-Lav

    Неблокирование raw_input () в python

    Почему PyCharm использует 120 символов, хотя PEP8 указывает 79?

    mod_cgi, mod_fastcgi, mod_scgi, mod_wsgi, mod_python, FLUP. Я не знаю, сколько еще. что такое mod_php эквивалент?

    Многопроцессорность Python не использует все ядра на RHEL6

    python: Могу ли я запустить скрипт python без фактической установки python?

    Как создать временный файл, который может быть прочитан подпроцессом?

    матрица расстояний кривых в python

    искать лучшее предложение дизайна для механизма проб и ошибок в python?

    Запись и чтение списков в текстовые файлы в Python: есть ли более эффективный способ?

    Выполните установку post-скрипта Python с помощью distutils / setuptools

    как обновить spyder на anaconda

    Эффективно переиндексировать один уровень с помощью «форвардной заливки» в мультииндексе данных

    Программа Python работает в IDLE, но не в командной строке

    Потоковая передача с помощью пушки

    Как найти размеры матрицы в Python?

    Python - лучший язык программирования в мире.