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

拟墨画扇 提交于 2019-12-17 10:49:26

问题


While reading the code of OpenStack and I encountered this.

A class named 'Service' inherits the base class 'object', and then in Service's __init__() method, object's __init__ is called. The related code looks like this:

the class definition:

class Service(object):

and Service's init method definition:

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

and a call to super(the 'object' here) in Service's init:

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

I don't understand last call, object.__init__() what does it actually do? can anyone help?


回答1:


The short answer is that object.__init__() method does nothing except check that no arguments have been passed in. See the source for details.

When called on an instance of Service, the super() call will delegate to object.__init__() and nothing will happen.

However, when called on an instance of a subclass of Service, things get more interesting. The super() call can potentially delegate to some class other than object, a class that is a parent of the instance but not a parent of Service. For details on how this works and why it is useful, see the blog post Python's Super Considered Super!

The following example (somewhat contrived) shows how a subclass of Service can cause the super call in Service to be directed to another class called 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')

In the example, initializations occur in the following order:

  1. Initializing Colored Service
  2. Initializing Service
  3. Initializing Color
  4. Initialize object -- doing nothing except argument checking



回答2:


super() does not always return a proxy for the parent class. Instead, it returns a proxy for the next class in MRO. In single-inheritance there is no difference between MRO and the inheritance chain. In multiple-inheritance, MRO may result in a class on the other inheritance chain instead.




回答3:


object.__init__() doesn't actually do anything but the super() call should be included even when a class only has object as a superclass.

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/super-harmful/



来源:https://stackoverflow.com/questions/8611712/what-does-objects-init-method-do-in-python

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!