1. 程式人生 > >python面向物件三大特性之一繼承

python面向物件三大特性之一繼承

繼承

即在定義一個類時,以另一個類為引數,則稱這個新定義的類繼承了引數類,父類又稱為基類。

單繼承表示只繼承一個類,多繼承表示繼承多個類。

class parent1:
    pass
class parent2:
    pass
class sub1(parent1):#單繼承
    pass
class sub2(parent1,parent2):#多繼承
    pass

1.子類繼承了父類的所有屬性,可以呼叫父類的屬性。

2.如果在子類中定義了與父類中相同的屬性,相當於在自己的屬性字典中增加了這些屬性,而不是覆蓋了父類的這些屬性。

 

繼承具有兩種含義:

1.繼承基類的方法,並且做出自己的改變或擴充套件(程式碼重用),不建議使用,會讓子類與父類出現耦合。

2.宣告某個子類繼承于于某基類,定義一個介面,子類繼承介面類,並且實現介面中定義的方法,介面就是一個函式。

即在父類中定義方法但是不指明介面的實現過程,子類繼承這個介面並且指明的實現過程。

定義介面需要匯入abc模組,並且在定義基類時新增metaclass=abc.ABCMeta,再在介面前用@abc.abstractmethod修飾即可。

import abc
class animal(metaclass=abc.ABCMeta): #定義基類時加metaclass=abc.ABCMeta引數
def __init__(self,name,leg): self.name=name self.leg=leg @abc.abstractmethod #在介面前面加@abc.abstractmethod def eat_food(self): pass
class cat(animal): #def eat_food(self): #print('eat food') cat1=cat('cat1',4) #報錯資訊Can't instantiate abstract class cat with abstract methods eat_food

如上述例子,cat類繼承了animal類,在不具體化eat_food介面的情況下例項化會報錯,去掉兩行註釋、即指定eat_food方法後才正常。

 

對於經典類,多繼承情況下,會按照深度優先方式進行查詢。

對於新式類,多繼承情況下,會按照深度廣度方式進行查詢。python3都是新式類。

class a:
    pass
    def test(self):
        print('a')
class b(a):
    pass
    # def test(self):
    #     print('b')
class c(a):
    pass
    # def test(self):
    #     print('c')
class d(a):
    def test(self):
        print('d')
class e(b):
    pass
    # def test(self):
    #     print('e')
class f(c):
    pass
    # def test(self):
    #     print('f')
class g(d):
    pass
    # def test(self):
    #     print('g')
class h(e,f,g):
    pass
    # def test(self):
    #     print('h')
print(h.__mro__)
h1=h()
h1.test()  #h-->e-->b-->f-->c-->g-->d-->a

可通過類的__mor__屬性檢視類的繼承順序。