Что делает метод init () объекта в python? [дубликат]

этот вопрос уже есть ответ здесь:

во время чтения кода OpenStack и я столкнулись с этим.

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

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

class Service(object):

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

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

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

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

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

3 ответов


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

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

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

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

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/