zoukankan      html  css  js  c++  java
  • python多继承及其super的用法

    python也具有多继承的功能,而同样的,大家能想到多继承必须要引入一些特定的方法来准确调用子类或基类的重载、重写的方法,否则会出现混乱。
    本文参考Multiple inheritance in Python对该问题进行简要论述。
    如下图描述了一个简单的类继承关系
    在这里插入图片描述
    下面是上面类图的代码,Class1、Class2、Class3都分别包含一个m方法,

    class Class1: 
        def m(self): 
            print("In Class1")  
            
    class Class2(Class1): 
        def m(self): 
            print("In Class2") 
      
    class Class3(Class1): 
        def m(self): 
            print("In Class3")   
             
    class Class4(Class2, Class3): 
        def __init__(self):
        	super(Class4, self).m()  
        	super(Class2, self).m()  
    		super(Class3, self).m()  
          
    obj = Class4() 
    

    上面代码的输出结果为:

    In Class2
    In Class3
    In Class1
    

    看出区别了吗,区别就在于super中的第一个参数。python的多继承通常来说是按顺序继承的,但也不尽然
    它的多继承顺序是依据一个叫做**Method Resolution Order (MRO)**的算法来决定的,通过使用类名.mro()可以得到继承关系的顺序。
    参考Python Multiple Inheritance中的一个例子
    如下图所示是一个比较复杂的继承关系图
    在这里插入图片描述
    其代码编写如下

    # Demonstration of MRO
    
    class X:
        pass
    
    
    class Y:
        pass
    
    
    class Z:
        pass
    
    
    class A(X, Y):
        pass
    
    
    class B(Y, Z):
        pass
    
    
    class M(B, A, Z):
        pass
    
    print(M.mro())
    

    而其输出结果为:

    [<class '__main__.M'>, <class '__main__.B'>, 
    <class '__main__.A'>, <class '__main__.X'>,
    <class '__main__.Y'>, <class '__main__.Z'>,
    <class 'object'>]
    

    在实际情况中,不可避免地会遇见这种比较复杂的继承关系,而要弄清楚它们的继承顺序似乎很是麻烦也容易出错,那么有没有办法直接指定调用某个基类的方法呢?
    这当然是可以的。

    class Class1: 
        def m(self): 
            print("In Class1")  
            
    class Class2(Class1): 
        def m(self): 
            print("In Class2") 
      
    class Class3(Class1): 
        def m(self): 
            print("In Class3")   
             
    class Class4(Class2, Class3): 
        def __init__(self):
        	Class1.m(self)
        	Class2.m(self)
    		Class3.m(self)  
          
    obj = Class4() 
    

    输出结果为:

    In Class1
    In Class2
    In Class3
    

    即,只需指定继承的类名,传入子类对象,即可调用任意指定基类的方法啦!

  • 相关阅读:
    Cheap Kangaroo(求多个数的最大公约数)
    poj 1094 Sorting It All Out(拓扑排序)
    hdu 5695 Gym Class(拓扑排序)
    Cyclic Components (并查集)
    GCD LCM
    And Then There Was One (约瑟夫环变形)
    System Overload(约瑟夫环变形)
    POJ-1639 Picnic Planning 度数限制最小生成树
    Educational Codeforces Round 60 (Rated for Div. 2) E. Decypher the String
    (ACM模板)二分查找
  • 原文地址:https://www.cnblogs.com/yinyoupoet/p/13287339.html
Copyright © 2011-2022 走看看