python查漏补缺--抽象类和接口以及Overrides、函数重载
目標:
掌握python中的抽象類和抽象接口。
封裝和繼承在java中用得挺多的,python中貌似用得真不多,但是為了應付考試,也是得了解。
學習內容:
抽象類,就是總結一些基本方法,每個子類必須自己實現這些方法。如果是接口,應該強制子類實現。不實現就報錯。
python抽象類和接口的區別:接口中的方法全部需要用抽象方法,強制繼承的對象實現。抽象類可以有部分方法已經實現
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()運行會報錯:說必須實現抽象類中的方法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、 子類可以實現不一樣的方法嗎?
接著實現一個bus的Car對象。
發現可以正常運行,說明abs中 @abstractclassmethod 只限制函數名,只要改函數名實現了就可以了。
3、 如果要強制子類實現一樣參數的函數呢?
這就要導入overrides包,java中很常見。
運行報錯:
TypeError: Bus.price: `money` is not present.overrides要求子類的方法參數必須和父類一致,而且參數名都要一樣(子類可以定義新的,但是父類的必須要有,因為python用參數名來確定給哪個參數傳值)。當然可以賦初始值。
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()運行結果:
Bus car is 600000 Bus car carry 20 passengers4、 發現python對用了java格式的重載有點不支持。
代碼如下:
運行直接報錯:
TypeError: price() missing 1 required positional argument: 'tax'后來發現:Python是動態類型語言,不支持java形式的重載。如果要重載,就用默認參數代替。為程序員著想的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只要包含了父類的參數名money就不會報錯。
Bus car is 60 Bus car is 80學習時間:
半小時足夠了
學習產出:
掌握
1、 java的抽象類實現方式,abc模塊。抽象類和接口定義。
2、java式的overrides,記得子類必須包含父類的相同參數名
3、 python的重載方式,給參數賦默認值。
總結
以上是生活随笔為你收集整理的python查漏补缺--抽象类和接口以及Overrides、函数重载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 报错org.apache.htrace
- 下一篇: 量化投资之定投,无脑却收益还不错,记得周