Что делает метод init () объекта в python? [дубликат]
этот вопрос уже есть ответ здесь:
- Python _ _ init_ _ и self что они делают? 19 ответов
во время чтения кода 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')
в Примере инициализации происходят в следующем порядке:
- Инициализация Цветной Службы
- Инициализация Службы
- Инициализация Цвет
- инициализировать объект-ничего не делать, кроме аргумента проверки
super()
не всегда возвращает прокси для родительского класса. вместо этого он возвращает прокси для следующий класс MRO. В одинарном наследовании нет разницы между MRO и цепочкой наследования. В множественном наследовании MRO может привести к классу на другое вместо этого цепочка наследования.
object.__init__()
фактически ничего не делает, кроме super()
вызов должен быть включен, даже если класс имеет только object
как суперкласс.
одна большая проблема с "супер" заключается в том, что это звучит как это может привести к копия вызываемого метода суперкласса. Это просто не в этом случае следующий метод в MRO вызывается (...) Люди опустить вызовы super(...).init если только суперкласс 'объект', как, ведь, объект.init ничего не делать! Однако это очень неверно. Это вызовет другие классы'init методы не быть призванным.