1. 程式人生 > >Python 面向對象特性二 多態(3-7)

Python 面向對象特性二 多態(3-7)

bstr 圖片 就是 方式 支付寶支付 chat font size 做出

接口類:

繼承有兩種用途:

一:繼承基類的方法,並且做出自己的改變或者擴展(代碼重用)

二:聲明某個子類兼容於某基類,定義一個接口類Interface,接口類中定義了一些接口名(就是函數名)且並未實現接口的功能,子類繼承接口類,並且實現接口中的功能

在Python中是沒有接口的概念的(接口是在Java裏的)

技術分享圖片
from abc import ABCMeta,abstractmethod#調用abc模塊中的抽象方法
# 接口類 : 接口類就是一個規範 接口類一般是項目設計人員寫好的
class Payment(metaclass=ABCMeta):   #規範
    @abstractmethod
    def pay(self,money):
        
‘‘‘ :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)
在Java裏

接口類是一種規範,從上述代碼可知,沒一種支付方式都是一個類,每個類中定義一種支付方法完成功能,由於每個支付方法在程序中表現出來的就是支付類的對象,我們要拿到每一個支付方法,位了方便支付方法的調用,都需要統一一個入口。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)