python面向物件三大特性之一繼承
阿新 • • 發佈:2018-12-09
繼承
即在定義一個類時,以另一個類為引數,則稱這個新定義的類繼承了引數類,父類又稱為基類。
單繼承表示只繼承一個類,多繼承表示繼承多個類。
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__屬性檢視類的繼承順序。