How does Python's super() work with multiple inheritance?

后端 未结 16 2161
孤街浪徒
孤街浪徒 2020-11-21 05:19

I\'m pretty much new in Python object oriented programming and I have trouble understanding the super() function (new style classes) especially when it comes to

16条回答
  •  离开以前
    2020-11-21 05:34

    About @calfzhou's comment, you can use, as usually, **kwargs:

    Online running example

    class A(object):
      def __init__(self, a, *args, **kwargs):
        print("A", a)
    
    class B(A):
      def __init__(self, b, *args, **kwargs):
        super(B, self).__init__(*args, **kwargs)
        print("B", b)
    
    class A1(A):
      def __init__(self, a1, *args, **kwargs):
        super(A1, self).__init__(*args, **kwargs)
        print("A1", a1)
    
    class B1(A1, B):
      def __init__(self, b1, *args, **kwargs):
        super(B1, self).__init__(*args, **kwargs)
        print("B1", b1)
    
    
    B1(a1=6, b1=5, b="hello", a=None)
    

    Result:

    A None
    B hello
    A1 6
    B1 5
    

    You can also use them positionally:

    B1(5, 6, b="hello", a=None)
    

    but you have to remember the MRO, it's really confusing. You can avoid this by using keyword-only parameters:

    class A(object):
      def __init__(self, *args, a, **kwargs):
        print("A", a)
    

    etcetera.

    I can be a little annoying, but I noticed that people forgot every time to use *args and **kwargs when they override a method, while it's one of few really useful and sane use of these 'magic variables'.

提交回复
热议问题