Python 面向對象特性二 多態(3-7)
阿新 • • 發佈:2018-03-08
bstr 圖片 就是 方式 支付寶支付 chat font size 做出
接口類:
繼承有兩種用途:
一:繼承基類的方法,並且做出自己的改變或者擴展(代碼重用)
二:聲明某個子類兼容於某基類,定義一個接口類Interface,接口類中定義了一些接口名(就是函數名)且並未實現接口的功能,子類繼承接口類,並且實現接口中的功能
在Python中是沒有接口的概念的(接口是在Java裏的)
from abc import ABCMeta,abstractmethod#調用abc模塊中的抽象方法 # 接口類 : 接口類就是一個規範 接口類一般是項目設計人員寫好的 class Payment(metaclass=ABCMeta): #規範 @abstractmethod def pay(self,money):在Java裏‘‘‘ :param money: :return: ‘‘‘ raise NotImplementedError class ApplePay(Payment):# 100 def pay(self,money):pass app = ApplePay() # 微信支付 # class WeChatPay(Payment): # def pay(self,money): # print(‘通過微信支付了%s元錢‘%(money)) # 支付寶支付 # class AliPay(Payment): # def pay(self,money): # print(‘通過支付寶支付了%s元錢‘%(money)) # apple pay # class ApplePay(Payment): pass # def pay(self,money): # print(‘通過支付寶支付了%s元錢‘ % (money)) # wp = WeChatPay() # alp = AliPay() # app = ApplePay() # def pay(pay_obj,money): # 程序的歸一化設計 # pay_obj.pay(money) # pay(alp,100) # pay(wp,100) # pay(app,100)
接口類是一種規範,從上述代碼可知,沒一種支付方式都是一個類,每個類中定義一種支付方法完成功能,由於每個支付方法在程序中表現出來的就是支付類的對象,我們要拿到每一個支付方法,位了方便支付方法的調用,都需要統一一個入口。pay函數。因為在Python中沒有節後類這種數據類型,沒有接口類專門的語法,這時候我們可以繼承abc模塊實現接口的功能。
接口類開發原則需要註意的是:接口類不能被實例化!
抽象類:
定義: 規範一個類的類 與java一樣,python也有抽象類的概念但是同樣需要借助模塊實現,抽象類是一個特殊的類,它的特殊之處在於只能被繼承,不能被實例化
與接口類的區別:
在Python中,抽象類和接口類沒有區別
在java裏 有區別:
java的接口類規定 類裏面的方法一定不能實現(一句代碼也不能寫)
抽象類 是單繼承
無論接口類 還是抽象類 其實都是一種面向對象編程的開發規範
只是在接口類或者抽象類中 去約束繼承它的子類必須實現某些方法
對於java代碼來說:如果發生多繼承 那麽一定是接口類 且裏面的方法都不能實現
# 如果在方法裏有了實現 那麽一定是單繼承 的抽象類
# 但是對於python來說 就沒有這些約束
# 因為python沒有接口的概念
# 對於類的繼承 沒有多繼承的限制
# 實際上abc模塊是幫我們實現抽象類的方法,只是我們用它來模仿接口類的效果了
在python中,只要metaclass = ABCMeta 定義了抽象方法(@abctractmethod)
# 這個類就不能被實例化
# 你可以說他是一個抽象類
from abc import ABCMeta, abstractmethod class File(metaclass=ABCMeta): @abstractmethod def read(self): f = open(‘file‘, ‘r‘) self.f = f @abstractmethod def write(self): f = open(‘file‘, ‘w‘) class Word(File): def read(self): # 打開一個文件 # 讀文件 # 關閉一個文件 super().read() self.f.read() self.f.close() class Excle(File): def read(self): # 打開一個文件 # 讀某一列 讀某一列 # 關閉一個文件 super().read() self.f.readline() self.f.close() class PPT(File): def read(self): # 打開一個文件 # 讀文字 讀表格 讀圖片 # 關閉一個文件 super().read() self.f.readpicture() self.f.close()抽象類
多態:所有的類都繼承父類
Python是自帶多態的(也可以理解為Python都是繼承了object這個父類)
Python是一門動態強類型語言
# class WeChatPay: # def pay(self,money): # print(‘通過微信支付了%s元錢‘%(money)) # class AliPay: # def pay(self,money): # print(‘通過支付寶支付了%s元錢‘%(money)) # def pay(pay_obj,money): # 程序的歸一化設計 # pay_obj.pay(money) # w = WeChatPay() # a = AliPay() # pay(w,100)多態
鴨子類型:將大致相同的屬性歸為一個父類,供子類調用
Java崇尚接口類,Python崇尚鴨子類型
Python 面向對象特性二 多態(3-7)