python查漏补缺--抽象类和接口以及Overrides、函数重载
目標:
掌握python中的抽象類和抽象接口。
封裝和繼承在java中用得挺多的,python中貌似用得真不多,但是為了應付考試,也是得了解。
學習內(nèi)容:
抽象類,就是總結(jié)一些基本方法,每個子類必須自己實現(xiàn)這些方法。如果是接口,應該強制子類實現(xiàn)。不實現(xiàn)就報錯。
python抽象類和接口的區(qū)別:接口中的方法全部需要用抽象方法,強制繼承的對象實現(xiàn)。抽象類可以有部分方法已經(jīng)實現(xiàn)
python 原生不支持接口類,需要導入abc包。python3.4以后自帶此包,不用在pip install。
1、 定義一個抽象類。
from abc import abstractclassmethod,ABCMetaclass Car(metaclass=ABCMeta):@abstractclassmethoddef price(self,money):pass@abstractclassmethoddef carryPassengers(self):passclass BaomaCar(Car):def price(self,money =300000):print('bao ma car is ' + money)baomaCar = BaomaCar() baomaCar.price()運行會報錯:說必須實現(xiàn)抽象類中的方法carryPassengers
TypeError: Can't instantiate abstract class BaomaCar with abstract methods carryPassengers然后修改代碼:
from abc import abstractclassmethod,ABCMetaclass Car(metaclass=ABCMeta):@abstractclassmethoddef price(self,money):pass@abstractclassmethoddef carryPassengers(self):passclass BaomaCar(Car):def price(self,money=30000):print('bao ma car is ' , money)def carryPassengers(self):print('bao ma car carry 5 passengers' )baomaCar = BaomaCar() baomaCar.price(350000) baomaCar.carryPassengers()可以正常運行。
bao ma car is 350000 bao ma car carry 5 passengers2、 子類可以實現(xiàn)不一樣的方法嗎?
接著實現(xiàn)一個bus的Car對象。
發(fā)現(xiàn)可以正常運行,說明abs中 @abstractclassmethod 只限制函數(shù)名,只要改函數(shù)名實現(xiàn)了就可以了。
3、 如果要強制子類實現(xiàn)一樣參數(shù)的函數(shù)呢?
這就要導入overrides包,java中很常見。
運行報錯:
TypeError: Bus.price: `money` is not present.overrides要求子類的方法參數(shù)必須和父類一致,而且參數(shù)名都要一樣(子類可以定義新的,但是父類的必須要有,因為python用參數(shù)名來確定給哪個參數(shù)傳值)。當然可以賦初始值。
from overrides import overrides class Bus(Car):@overridesdef price(self,money=600000):print('Bus car is ' , money)def carryPassengers(self):print('Bus car carry 20 passengers' ) bus = Bus() bus.price() bus.carryPassengers()運行結(jié)果:
Bus car is 600000 Bus car carry 20 passengers4、 發(fā)現(xiàn)python對用了java格式的重載有點不支持。
代碼如下:
運行直接報錯:
TypeError: price() missing 1 required positional argument: 'tax'后來發(fā)現(xiàn):Python是動態(tài)類型語言,不支持java形式的重載。如果要重載,就用默認參數(shù)代替。為程序員著想的Python!
解決重載的方式,用默認值。
from abc import abstractclassmethod,ABCMeta class Car(metaclass=ABCMeta):@abstractclassmethoddef price(self,money):passfrom overrides import overrides class Bus(Car):@overridesdef price(self,money,tax = 10): #重載price方法print('Bus car is ' , money + tax)bus = Bus() bus.price(money=50) bus.price(money=50,tax=30)overrides只要包含了父類的參數(shù)名money就不會報錯。
Bus car is 60 Bus car is 80學習時間:
半小時足夠了
學習產(chǎn)出:
掌握
1、 java的抽象類實現(xiàn)方式,abc模塊。抽象類和接口定義。
2、java式的overrides,記得子類必須包含父類的相同參數(shù)名
3、 python的重載方式,給參數(shù)賦默認值。
總結(jié)
以上是生活随笔為你收集整理的python查漏补缺--抽象类和接口以及Overrides、函数重载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 报错org.apache.htrace
- 下一篇: python编程内置函数使用方法_Pyt