python筆記(介面類和抽象類)
阿新 • • 發佈:2018-11-24
一、介面類:(python原生不支援,預設多繼承,所有的方法都必須不能實現)
from abc import abstractmethod,ABCMeta class Payment(metaclass=ABCMeta): #元類 預設的元類 type @abstractmethod def pay(self): raise NotImplemented #沒有實現這個方法 class Wechat: def pay(self,money): print('已經用微信支付了%s元'%money) class Alipay: def pay(self,money): print('已經用支付寶支付了%s元'%money) class Applepay: def fuqian(self,money): print('已經用Applepay支付了%s元'%money) def pay(pay_obj,money): #統一支付入口 pay_obj.pay(money) wechat = Wechat() ali = Alipay() apple_pay = Applepay() pay(wechat,200) pay(ali,300) pay(apple_pay,100)
輸出結果:
>>已經用微信支付了200元
File "D:/Python/python_txt/GUI進度條/GUI.py", line 1135, in pay
已經用支付寶支付了300元
pay_obj.pay(money)AttributeError: 'Applepay' object has no attribute 'pay'
二、抽象類:(python原生支援,不支援多繼承,抽象類中方法可以有一些程式碼實現)
from abc import abstractmethod,ABCMeta class Swim_Animal(metaclass=ABCMeta): @abstractmethod def swim(self): pass swim_animal = Swim_Animal() class Walk_Animal(metaclass=ABCMeta): @abstractmethod def walk(self): pass walk_wnimal = Walk_Animal() class Fly_Animal(metaclass=ABCMeta): @abstractmethod def fly(self): pass fly_animal = Fly_Animal() class Tiger(Walk_Animal,Swim_Animal): def walk(self): def swim(self): pass class Swan(Walk_Animal,Fly_Animal,Swim_Animal):pass tiger = Tiger() tiger.walk()
1、抽象類規範
一般情況下單繼承能實現的功能都是一樣的,所以在父類中可以有一些簡單的基礎實現
多繼承的情況,由於功能比較複雜,所以不容易抽象出相同的功能的具體實現寫在父類中
2、抽象類還是介面類:面向物件的開發規範
(1)python中沒有介面類:java裡有介面Interface這個概念
(2)python中自帶多繼承,所以我們直接用class來實現了介面類
(3)python中支援抽象類:一般情況下單繼承不能例項化
(4)多型python天生支援多型(動態強型別的語言)
3、鴨子型別
(1)不崇尚根據繼承所得來的相似
(2)我只是自己實現自己的程式碼就可以了
(3)如果兩個類剛好相似,並不產生父類的子類的兄弟關係,而是鴨子型別
例:tuple list 這種相似是自己寫程式碼時約束的,而不是通過父類約束的
(4)優點:鬆耦合 每個相似的類之間都沒有影響
class List:
def __len__(self):pass
class Tuple:
def __len__(self):pass
def len(obj):
return obj.__len__()
l = Tuple()
len(l)
(5)介面類和抽象類在python當中的應用點並不是非常必要
三、複習:
1、抽象類和介面類
(1)本質是做程式碼規範用的,希望在子類中實現和父類方法名字完全一樣的方法
(2)java的角度上看是有區別的:
java本來就支援單繼質所以就有了抽象類
java沒有多繼承所以為了介面離原則,設計了接這個概念,支援多繼承了
2、python及支援單繼承也支援多繼,所以對於介面類和抽象類的區別就不那麼明顯了, 甚至在 python中沒有內建介面類
3、多型和鴨子型別:
(1)多型: python天生支援多型
(2)鴨子型別:不依賴父類的情況下實現兩個相似的類中的同名方法