zoukankan      html  css  js  c++  java
  • python之多继承中的一些问题

    python与Java不同,是支持多继承的。这里的多继承指的的是多重继承,即一个子类可以同时继承多个父类。而多层继承就是一层一层的继承,比如A继承B,Bj继承C等。直接看代码:

    多重继承:

    class A:
        def testA(self):
            print("这是父类A的test方法")
    class B:
        def testB(self):
            print("这是父类B的test方法")
    class C(A,B):
        def myTest(self):
            print("这是子类自己的方法")
    
    c = C()
    c.testA()
    c.testB()

    通过class 子类名(父类名1,父类名2,...)来进行多重继承。子类可以同时有其父类的所有公有属性和方法。

    既然python中存在多重继承,为什么Java中不可以有多重继承呢?

    因为多重继承存在一些问题。现有以下代码:

    class A:
        def test(self):
            print("这是父类A的test方法")
    class B:
        def test(self):
            print("这是父类B的test方法")
    class C(A,B):
        def myTest(self):
            print("这是子类自己的方法")
    
    c = C()    
    c.test()

    当多重继承中父类中存在同名的方法,那么此时,子类在调用时会调用哪个方法呢?这就存在了二义性,在python中,为了避免这种情况,使用MRO的方式进行方法的查找,即按照继承的顺序依次查找。如果子类中重写了该方法,就调用子类本身的,如果没有,就先查找A,找到了就调用,找不到就继续往下找,查找B,以此类推。如果最终都没有找到匹配的,就会报错。菱形继承是多重继承的典型问题,有兴趣可以去了解。在java中,可以通过接口或者内部类来实现这种类似多重继承的作用。有兴趣的也可以去了解。

    多层继承:

    class A:
        def test(self):
            print("这是A的test方法")
    class B(A):
        def test(self):
            super().test()
            print("这是B的test方法")
    class C(B):
        def myTest(self):
            print("这是C的方法")
    
    c = C()
    c.test()

    同样的,子类C如果重写了B中的test方法,就会首先调用子类自己的方法,如果没有,就调用父类B的方法,要想进一步调用A的test方法,只需要在A的子类B中使用super关键字即可。super关键字表示该类的父类。

    输出:

    无论怎么样,多重继承只是一个手段,并没有其优劣之分,只有使用者合理的利用,那么它才能发挥出应有的作用, 

  • 相关阅读:
    Luogu P4316 绿豆蛙的归宿 题解报告
    Luogu P1850 换教室(NOIP 2016) 题解报告
    Rainbow的信号 题解报告
    $CH5105 Cookies$ 线性$DP+$贪心
    算法竞赛 $0×50$ 动态规划 (+一本通
    $CH5104 I-country$ 线性$DP$
    洛谷$2014$ 选课 背包类树形$DP$
    $SP703 Mobile Service DP$
    $POJ1015 Jury Compromise Dp$/背包
    $POJ1742 Coins$ 多重背包+贪心
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12144046.html
Copyright © 2011-2022 走看看