今天我們主要來介紹“繼承”,這是類的一個很重要的功能。
什麼是繼承呢?就是說當你定義了一個類後,如果我希望有一個新的類,可以擁有之前類的所有屬性和方法,同時也能建立自己的屬性和方法。
此時,這個新的類就叫做子類,之前的類就叫做父類,將父類的屬性和方法“複製”到子類中的這個動作就叫做
繼承
。也就是說,子類既有和父類的“共性”,又有自己的“個性”。
1
多說無益,我們先來看一個例子:
class Bike: def __init__(self,model,year): self。model = model self。year = year self。distance = 0 def dis(self): print(f‘The {self。model} has {self。distance} km on it。’) def update_dis(self,km): if km >= self。distance: self。distance = km else: print(“Wrong behavior!”)class Mountain_bike(Bike): def __init__(self,model,year): super()。__init__(model,year)
在這段程式碼中,我們先定義了一個父類
Bike
,然後又定義了一個子類
Mountain_bike
,希望能繼承父類。因此,在子類後要加一個括號,裡面寫上父類的名字。這裡我們的父類是腳踏車,而子類是山地車,山地車是腳踏車的一種。
之後,定義呼叫子類時自動執行的方法
__init__
,因為我們想繼承父類,所以
super
()就表示繼承的含義,它表示呼叫父類的方法。super是superclass(超類)的簡寫,因此父類又被稱為超類。
我們希望繼承父類的屬性,因此後面要跟__init_
_
方法,但裡面的引數就不用寫self了,這裡只表示繼承關係。
將子類例項化後,它就可以呼叫父類的屬性和方法了,比如:
new_bike = Mountain_bike(‘XC’,2021)new_bike。dis()
輸出結果為:
The XC has 0 km on it。
2
當然,子類也可以擁有自己的屬性和方法,讓我們給之前的
Mountain_bike
新增一些吧:
class Mountain_bike(Bike): def __init__(self,model,year): super()。__init__(model,year) self。transmission = 27 def speed_changer(self): print(f“The {self。model} has {self。transmission} shifting。”)
注意第4行程式碼,我們給子類添加了一個transmission的屬性,它表示山地車的速別,這裡預設是27速。
然後又添加了一個
speed_changer
的方法,列印當前型號山地車的速別。
我們將其例項化,呼叫子類的新方法看下:
new_bike = Mountain_bike(‘XC’,2021)new_bike。speed_changer()The XC has 27 shifting。
3
有時候父類的方法可能過時了,不再適合所有子類,這時你可以在子類中重寫父類的方法。
具體的操作是,在子類中定義一個和父類方法完全相同的名字,然後寫入新的內容:
class Mountain_bike(Bike): def __init__(self,model,year): super()。__init__(model,year) self。transmission = 27 def speed_changer(self): print(f“The {self。model} has {self。transmission} shifting。”) def update_dis(self): #和父類方法同名 print(‘You can not do this!’)
注意第7行,當你定義了一個和父類完全相同的方法時,在子類例項化之後,如果呼叫該方法,那麼將使用子類中的定義,而覆蓋掉原先父類中的定義。我們將其例項化,看下結果:
new_bike = Mountain_bike(‘XC’,2021)new_bike。update_dis()You can not do this!
4
有時候你會發現有些子類的方法是類似,你可以把它們提取出來,作為一個新的類。同時,新類的例項也可以作為屬性應用到原來的類中。
比如山地車都有速別這個屬性,那麼我可以將其單獨建立一個類:
class Transmission: def __init__(self,transmission = 27): self。transmission = transmission def speed_changer(self): print(f“The bike has {self。transmission} shifting。”)
我可以在山地車這個類中,將
Transmission
例項化,作為其屬性:
class Mountain_bike(Bike): def __init__(self,model,year): super()。__init__(model,year) self。trans = Transmission() #例項用作屬性
注意第4行程式碼,新類被例項化,賦給了屬性trans,這意味著該屬性可以呼叫
Transmission
類中的所有屬性和方法。比如下面這樣:
new_bike = Mountain_bike(‘XC’,2021)new_bike。trans。speed_changer()
看下結果:
The bike has 27 shifting。
關於類的內容,終於介紹完了,你都get到了嗎?