91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

09-04 多態性與鴨子類型

發布時間:2020-03-02 22:36:38 來源:網絡 閱讀:223 作者:linhaifeng4573 欄目:編程語言

多態與多態性

多態指的是一類事物有多種形態,比如動物有多種形態:貓、狗、豬

class Animal: #同一類事物:動物
    def talk(self):
        pass
class Cat(Animal): #動物的形態之一:貓
    def talk(self):
        print('喵喵喵')
class Dog(Animal): #動物的形態之二:狗
    def talk(self):
        print('汪汪汪')
class Pig(Animal): #動物的形態之三:豬
    def talk(self):
        print('哼哼哼')

#實例化得到三個對象
>>> cat=Cat()
>>> dog=Dog()
>>> pig=Pig()

插圖:惡搞圖34
09-04 多態性與鴨子類型

多態性指的是可以在不用考慮對象具體類型的情況下而直接使用對象,這就需要在設計時,把對象的使用方法統一成一種:例如cat、dog、pig都是動物,但凡是動物肯定有talk方法,于是我們可以不用考慮它們三者的具體是什么類型的動物,而直接使用

>>> cat.talk()
喵喵喵
>>> dog.talk()
汪汪汪
>>> pig.talk()
哼哼哼

更進一步,我們可以定義一個統一的接口來使用

>>> def Talk(animal):
...     animal.talk()
... 
>>> Talk(cat)
喵喵喵
>>> Talk(dog)
汪汪汪
>>> Talk(pig)
哼哼哼

插圖:惡搞圖35
09-04 多態性與鴨子類型

Python中一切皆對象,本身就支持多態性

# 我們可以在不考慮三者類型的情況下直接使用統計三個對象的長度
s.__len__()
l.__len__()
t.__len__()

# Python內置了一個統一的接口
len(s)
len(l)
len(t)

插圖:惡搞圖36
09-04 多態性與鴨子類型

多態性的好處在于增強了程序的靈活性和可擴展性,比如通過繼承Animal類創建了一個新的類,實例化得到的對象obj,可以使用相同的方式使用obj.talk()

>>> class Wolf(Animal): #動物的另外一種形態:狼
...     def talk(self):
...         print('嗷...')
... 
>>> wolf=Wolf() # 實例出一頭狼
>>> wolf.talk() # 使用者根本無需關心wolf是什么類型而調用talk
嗷...

插圖:惡搞圖37
09-04 多態性與鴨子類型

綜上我們得知,多態性的本質在于不同的類中定義有相同的方法名,這樣我們就可以不考慮類而統一用一種方式去使用對象,可以通過在父類引入抽象類的概念來硬性限制子類必須有某些方法名

import abc

# 指定metaclass屬性將類設置為抽象類,抽象類本身只是用來約束子類的,不能被實例化
class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod # 該裝飾器限制子類必須定義有一個名為talk的方法
    def talk(self): # 抽象方法中無需實現具體的功能
        pass

class Cat(Animal): # 但凡繼承Animal的子類都必須遵循Animal規定的標準
    def talk(self):
        pass

cat=Cat() # 若子類中沒有一個名為talk的方法則會拋出異常TypeError,無法實例化

插圖:惡搞圖38
09-04 多態性與鴨子類型

但其實我們完全可以不依賴于繼承,只需要制造出外觀和行為相同對象,同樣可以實現不考慮對象類型而使用對象,這正是Python崇尚的“鴨子類型”(duck typing):“如果看起來像、叫聲像而且走起路來像鴨子,那么它就是鴨子”。比起繼承的方式,鴨子類型在某種程度上實現了程序的松耦合度,如下
09-04 多態性與鴨子類型

#二者看起來都像文件,因而就可以當文件一樣去用,然而它們并沒有直接的關系
class Txt: #Txt類有兩個與文件類型同名的方法,即read和write
    def read(self):
        pass
    def write(self):
        pass

class Disk: #Disk類也有兩個與文件類型同名的方法:read和write
    def read(self):
        pass
    def write(self):
        pass

插圖:惡搞圖39
09-04 多態性與鴨子類型

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

儋州市| 丰县| 新沂市| 冷水江市| 礼泉县| 拉萨市| 黄梅县| 温州市| 比如县| 永安市| 清水河县| 北流市| 嫩江县| 阜康市| 浦县| 西乌珠穆沁旗| 江城| 静海县| 利辛县| 桂林市| 托里县| 永济市| 丹阳市| 赣州市| 泸溪县| 昌乐县| 凤冈县| 贡山| 金沙县| 九龙县| 濮阳市| 龙岩市| 奉新县| 融水| 紫阳县| 重庆市| 桐乡市| 古浪县| 南昌市| 遂宁市| 娱乐|