Что делает объект __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/

  • __init__ и аргументы в Python
  • Что вызывает «unbound method __init __ () должен быть вызван с экземпляром как первый аргумент« из этого кода Python?
  • Инициализация Python
  • Blender Python `bpy`` __init __. Py`, видимо импортирующий из несуществующего модуля` _bpy`
  • Python: наследуйте суперкласс __init__
  • Запись в Python: почему __init__ вызывается дважды?
  • Есть ли причина выбирать __new__ над __init__ при определении метакласса?
  • Многоуровневое наследование Python, __init__
  •  
    Interesting Posts for Van-Lav

    Python: Как проверить, что ячейка в CSV-файле пуста?

    Как переписать строку на диаграмме рассеяния в python?

    Осциллирующая скорость обработки в скрипте python с использованием pysam.TabixFile для комментирования показаний

    Невозможно применить методы на временных отметках с помощью встроенных встроенных модулей

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

    Как заменить все записи, отличные от NaN, на единицу данных с 1 и все NaN с помощью 0

    Закройте уже существующие фигуры в matplotlib при работе от затмения

    Рекурсивная вставка Сортировка в python

    Вычисление локальных средств в массиве 1D numpy

    Система шаблонов для Python и Javascript?

    MySQLdb Python вставляет% d и% s

    Регулярное выражение Python для чтения CSV-подобных строк

    Решение головоломки n-queen

    Измерьте размер объекта точно в Python – Sys.GetSizeOf не работает

    Советы по чтению в сложном файле – Python

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