python基礎-面向物件(六)類的繼承
阿新 • • 發佈:2020-12-09
一.什麼是繼承?
繼承:類的繼承就跟現實生活一樣,父、子、孫。父類又稱為基類
繼承分為單繼承和多繼承
class Parent1: pass class Parent2: pass class Son1(Parent1): #單繼承 pass class Son2(Parent1,Parent2): #多繼承 pass
二.為什麼要繼承?
1減少程式碼冗餘、提高重用性(程式碼重用就耦合了,這個不是重點)
2 歸一化設計。(相同的程式碼有相同的功能,比如貓會吃喝拉撒,狗也會吃喝拉撒,定義基類,動物類,包含吃喝拉撒,是為了確保貓和狗都必須有吃喝拉撒,使用者一看到吃喝拉撒就知道是幹什麼的)
三.繼承了父類的什麼屬性?
資料屬性和函式屬性都繼承了。
class Dad: money = 10 def __init__(self, name): self.name = name def hit_son(self): print('%s正在打兒子' % self.name) class Son(Dad): pass son1 = Son('alex') print(son1.money) # 呼叫父類的資料屬性 son1.hit_son() # 呼叫父類的函式屬性 print(Dad.__dict__) print(Son.__dict__)
四.什麼時候用繼承?
1.當類之間明顯不同,但又有關聯的時候用組合(如學校和老師)
2.當類之間有很多相同的功能,提取這些功能做成基類,用繼承(如貓吃喝拉撒,狗也吃喝拉撒。可以做個動物基類,吃喝拉撒)
五.介面繼承,歸一化設計
歸一化設計。相同的程式碼有相同的功能,比如貓會吃喝拉撒,狗也會吃喝拉撒,定義基類,動物類,包含吃喝拉撒,是為了確保貓和狗都必須有吃喝拉撒,使用者一看到吃喝拉撒就知道是幹什麼的。
要求必須重寫,可以abc模組
import abc class Animal(metaclass=abc.ABCMeta): @abc.abstractmethoddef chi(self): pass @abc.abstractmethod def he(self): pass def la(self): pass def sha(self): pass class Dog(Animal): def chi(self): pass def he(self): pass dog1 = Dog()
六.繼承順序
經典類(沒有繼承object的)是深度優先。新式類是廣度優先。新式類可用__mro__檢視
class A: pass class B(A): pass class C(A): pass class D(B): pass class E(C): pass class F(E, D): pass print(F.mro())
繼承順序:先子類後父類。同時繼承多個,先繼承寫在前面的
七.子類中呼叫父類方法
class Vehicle: Country = 'China' def __init__(self, name, speed, power): self.name = name self.speed = speed self.power = power def run(self): print('開動啦') class Subway(Vehicle): def __init__(self, name, speed, power, line): # Vehicle.__init__(self, name, speed, power) super().__init__(self, name, speed, power) self.line = line subway1 = Subway('復興號', '100m/s', 'elc', '19號線') print(subway1.name, subway1.speed)
如果父類名字修改後,程式碼都要改名字,為了避免這種情況,可使用super()代替父類的名字