object 的 __init__() 方法在 python 中有什么作用?

新手上路,请多包涵

在阅读 OpenStack 的代码时,我遇到了这个问题。

名为’Service’的类继承基类’object’,然后在Service的 __init__() 方法中,调用对象的 __init__ 。相关代码如下所示:

类定义:

 class Service(object):

和服务的初始化方法定义:

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

并在 Service 的 init 中调用 super(这里的“对象”):

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

我不明白最后一个电话, object.__init__() 它实际上做了什么?谁能帮忙?

原文由 can. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 434
2 个回答

简短的回答是 object.init() 方法除了检查是否没有传入任何参数外什么都不做。有关详细信息,请参阅 源代码

当在 Service 的实例上调用时, super() 调用将委托给 object.init() 并且什么都不会发生。

然而,当调用 Service 子类的实例时,事情变得更有趣了。 super() 调用可能会委托给 object 以外的某个类,该类是实例的父类,但不是 Service 的父类。有关其工作原理和有用原因的详细信息,请参阅博客文章 Python 的 Super Considered Super

下面的例子(有点做作)显示了 Service 的子类如何导致 Service 超级 调用被定向到另一个名为 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. 初始化对象——除了参数检查什么都不做

原文由 Raymond Hettinger 发布,翻译遵循 CC BY-SA 3.0 许可协议

super() 并不总是返回父类的代理。 相反,它返回 MRO 中下一类 的代理。在单继承中,MRO 和继承链之间没有区别。在多重继承中,MRO 可能会在 另一个 继承链上产生一个类。

原文由 Ignacio Vazquez-Abrams 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题