python 多重繼承時候帶參數和不帶參數時候初始化父類super

1.不帶參數的多重繼承


class A(object):
    def show_x(self):
        print('A')
        
        
class B(object):
    def show_y(self):
        print('B')
        
        
class C(object):
    def show_z(self):
        print('C')
        
        
class D(A, B, C):
    pass
        
        
# 測試
if __name__ == '__main__':
    d = D()
    d.show_x() # A
    d.show_y() # B
    d.show_z() # C

2. 帶參數的多重繼承


class A(object):
    def __init__(self, x=0):
        self._x = x
    
    def show_x(self):
        print(self._x)
        
    def show_name(self):
        print('A')
        
        
class B(object):
    def __init__(self, y=0):
        self._y = y
    
    def show_y(self):
        print(self._y)
        
    def show_name(self):
        print('B')
        
        
class C(object):
    def __init__(self, z=0):
        self._z = z
    
    def show_z(self):
        print(self._z)
        
    def show_name(self):
        print('C')
        
# 注意下面兩類D、E,都是繼承A、B、C,且A類的優先級最高。但是三條__init__語句的順序是相反的
class D(A, B, C):
    def __init__(self, x=0, y=0, z=0):
        C.__init__(self, z) # init C
        B.__init__(self, y) # init B
        A.__init__(self, x) # init A (A最優先)
        
class E(A, B, C):
    def __init__(self, x=0, y=0, z=0):
        super(E, self).__init__(x) # init A (A最優先)  # 此句可簡寫成:super().__init__(x)
        super(A, self).__init__(y) # init B
        super(B, self).__init__(z) # init C
        
        
        
# 測試
if __name__ == '__main__':
    d = D(1,2,3)
    d.show_x()    # 1
    d.show_y()    # 2
    d.show_z()    # 3
    d.show_name() # A
    
    e = E(1,2,3)
    e.show_x()    # 1
    e.show_y()    # 2
    e.show_z()    # 3
    e.show_name() # A
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章