Что делает объект __init __ () в python?

Я читаю код OpenStack, и я столкнулся с этим.

Класс с именем «Сервис» наследует базовый класс «объект», а затем, в __init__() службы, вызывается объект __init__ объекта. Связанный код выглядит следующим образом:

определение класса:

 class Service(object): 

и определение метода инициализации службы:

 def __init__(self, host, binary, topic, manager, report_interval=None, periodic_interval=None, *args, **kwargs): 

и вызов super («объект» здесь) в начале службы:

 super(Service, self).__init__(*args, **kwargs) 

Я не понимаю, что делает последний вызов, object.__init__() . любой может помочь?

3 Solutions collect form web for “Что делает объект __init __ () в python?”

Короткий ответ заключается в том, что объект .__ init __ () не делает ничего, кроме проверки того, что аргументы не были переданы. Подробнее см. Источник .

При вызове экземпляра службы вызов super () будет делегировать объект .__ init __ (), и ничего не произойдет.

Однако, когда вызывается экземпляр подкласса Службы , все становится интереснее. Вызов super () может потенциально делегировать какой-либо класс, отличный от объекта , класс, являющийся родителем экземпляра, но не являющийся родителем службы . Подробнее о том, как это работает и почему это полезно, см. В блоге Python Super Super Super !

Следующий пример (несколько надуманный) показывает, как подкласс службы может вызвать супервызов в службе, который будет перенаправлен в другой класс Color :

 class Service(object): def __init__(self, host, binary, topic, manager, report_interval=None, periodic_interval=None, *args, **kwargs): print 'Initializing Service' super(Service, self).__init__(*args, **kwargs) class Color(object): def __init__(self, color='red', **kwargs): print 'Initializing Color' self.color = color super(Color, self).__init__(**kwargs) class ColoredService(Service, Color): def __init__(self, *args, **kwds): print 'Initializing Colored Service' super(ColoredService, self).__init__(*args, **kwds) c = ColoredService('host', 'bin', 'top', 'mgr', 'ivl', color='blue') 

В этом примере инициализация происходит в следующем порядке:

  1. Инициализация цветной службы
  2. Инициализация службы
  3. Инициализация цвета
  4. Инициализировать объект – ничего не делать, кроме проверки аргументов

super() не всегда возвращает прокси для родительского класса. Вместо этого он возвращает прокси для следующего класса в MRO . В одном наследовании нет разницы между MRO и цепочкой наследования. При множественном наследовании MRO может привести к классу в другой цепочке наследования.

object.__init__() самом деле ничего не делает, но вызов super() должен быть включен, даже если класс имеет только object в качестве суперкласса.

Одна из больших проблем с «супер» заключается в том, что похоже, что это вызовет вызов суперкласса метода. Это просто не так, это вызывает следующий метод в MRO, который будет вызван (…) Люди пропускают вызовы super (…). init, если единственным суперклассом является «объект», как, в конце концов, объект. init ничего не делает! Однако это очень неверно. Это приведет к тому, что методы init других классов не будут вызваны.

http://fuhm.net/super-harmful/

  • Pycharm (Python IDE) не выполняет автоматическое заполнение модулей Django
  • Установка обработчика сигналов с помощью Python
  • __init__ вызывается несколько раз с этой реализацией Singleton? (Python)
  • Цель __init__
  • Как вызвать средство настройки свойств из __init__
  • Многоуровневое наследование Python, __init__
  • вызов init для нескольких родительских классов с супер?
  • Класс Numpy Matrix: атрибуты конструктора по умолчанию для унаследованного класса
  • Передача загрузки Linux выбирает Init
  • Что вызывает «unbound method __init __ () должен быть вызван с экземпляром как первый аргумент« из этого кода Python?
  • Subclassing dict: должен ли вызывать .__ init __ ()?
  • Python - лучший язык программирования в мире.