1

super() returns an instance of a super class that tracks the current position in the MRO. When calling a method on a super instance, super looks up the next class in the MRO and calls the method on that class.

Mark Tolonen give a explanation

class mon():
    def __init__(self):
        print("i am in mon's init")
        print(super())
        print(super().__init__)
        super().__init__()

class far():
    def __init__(self):
        print("i am in far's init")
        print(super())
        print(super().__init__)
        super().__init__()

class son(mon,far):
    def __init__(self):
        print("i am in son's init")
        print(super())
        print(super().__init__)
        super().__init__()

Show the MRO on son class.

son.__mro__
(<class '__main__.son'>, <class '__main__.mon'>, <class '__main__.far'>, <class 'object'>)

Initialize a son class to check what super() is and super().__init__ point to.

x = son()
i am in son's init
<super: <class 'son'>, <son object>>
<bound method mon.__init__ of <__main__.son object at 0x7ff0376f5c70>>
i am in mon's init
<super: <class 'mon'>, <son object>>
<bound method far.__init__ of <__main__.son object at 0x7ff0376f5c70>>
i am in far's init
<super: <class 'far'>, <son object>>
<method-wrapper '__init__' of son object at 0x7ff0376f5c70>

We draw conclusions:

1.super() returns an instance of a super class that tracks the current position in the MRO.
2.When calling a method on a super instance, super looks up the next class in the MRO and calls the method on that class, except the far class in this example.

The super().__init__ in far class should point to <class 'object'>,what does <method-wrapper '__init__' of son object mean here?

<method-wrapper '__init__' of son object at 0x7ff0376f5c70>

Maybe the output should be:

<bound method object.__init__ of <__main__.son object at 0x7ff0376f5c70>>

If super().__init__ means son.__init__,all info should output twice.

U13-Forward
  • 69,221
  • 14
  • 89
  • 114
showkey
  • 482
  • 42
  • 140
  • 295

0 Answers0