对象的 __init__()在python中做什么?

What does object's __init__() method do in python?

本问题已经有最佳答案,请猛点这里访问。

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

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

类定义:

1
class Service(object):

以及服务的init方法定义:

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

以及对服务的init中的super(这里的"object")的调用:

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

我不明白最后一个电话,object.__init__()它实际上是做什么的?有人能帮忙吗?


简短的答案是这个对象。uuInit_uu()方法除了检查是否没有传入任何参数外,什么都不做。有关详细信息,请参阅来源。

当对服务实例调用时,super()调用将委托给对象。uu init_uu(),不会发生任何事情。

但是,当调用服务子类的实例时,事情会变得更有趣。super()调用可能委托给对象以外的某个类,该类是实例的父类,但不是服务的父类。有关如何工作以及为什么它有用的详细信息,请参阅博客文章python的super-considered super!

下面的示例(有点做作)显示了服务的子类如何导致超级调入服务定向到另一个名为color的类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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作为超类。

    One big problem with 'super' is that it sounds like it will cause the
    superclass's copy of the method to be called. This is simply not the
    case, it causes the next method in the MRO to be called (...) People
    omit calls to super(...).init if the only superclass is 'object',
    as, after all, object.init doesn't do anything! However, this is
    very incorrect. Doing so will cause other classes' init methods to
    not be called.

    http://fuhm.net/超有害/