Подтвердить что ты не робот

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

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

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

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

class Service(object):

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

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

и вызов super ( "объект" здесь) в Service init:

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

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

4b9b3361

Ответ 1

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

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

Однако при вызове экземпляра подкласса Service все становится интереснее. Вызов super() может потенциально делегировать какой-либо класс, отличный от объекта, класс, являющийся родителем экземпляра, но не являющийся родителем службы. Подробнее о том, как это работает и почему это полезно, см. Запись в блоге Python 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')

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

  • Инициализация цветной службы
  • Инициализация службы
  • Инициализация цвета
  • Инициализировать объект - ничего не делать, кроме проверки аргументов

Ответ 2

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

Ответ 3

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

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

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