有风陪伴的日子 发表于 2019-2-7 23:44:26

求助!关于super()的用法

请看下面的代码:

class A:
    def __init__(self):
      print('A')

class B:
    def __init__(self):
      print('B')

class C(A,B):
    def __init__(self):
      print("C")
      super().__init__()

c = C()

结果:

C
A

但如果在A类的print后加上super().__init(),结果就是:

C
A
B

这到底是为什么啊,头疼{:10_247:}

ba21 发表于 2019-2-8 00:03:17

本帖最后由 ba21 于 2019-2-8 00:05 编辑

但如果在A类的print后加上super().__init(),结果就是:
能正常工作?

有风陪伴的日子 发表于 2019-2-8 10:29:13

ba21 发表于 2019-2-8 00:03
但如果在A类的print后加上super().__init(),结果就是:
能正常工作?

能啊。写成:
class A:
      def __init__(self):
            print("A")
             super().__init__()

YJR——Allen.H 发表于 2019-2-13 15:59:05

多继承比较复杂,以后少用
一般在多继承时不用super函数,一般这么用
class A():
    def __init__(self):
      print('A')

class B():
    def __init__(self):
      print('B')
      
class C(A,B):
    def __init__(self):
      print("C")
      A.__init__(self)
      B.__init__(self)
      
c = C()


你的程序中C类先继承了A类,再继承B类,如果用super函数,super先在A类中找到了__init__方法,没去管B类
试试下面这个:
class A:
    def __init__(self):
      print('A')

class B:
    def __init__(self):
      print('B')
      
class C(B,A):
    def __init__(self):
      print("C")
      super().__init__()
      
c = C()


在A类中的__init__方法使用super,super排除了A类,在B类查找,所以执行B类的__init__方法

总之多继承很复杂,要避免使用,希望对你有用

暴暴蓝 发表于 2019-8-22 15:01:44

有风陪伴的日子 发表于 2019-2-8 10:29
能啊。写成:
class A:
      def __init__(self):


>>> print(C.mro())
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
super获取的是mro()中的下一个列表。
在MRO列表中,C的下一个类是A。所以在C类中的super(),代表A。A类中的super(),代表B,以此类推
页: [1]
查看完整版本: 求助!关于super()的用法