真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

09-04多態(tài)性與鴨子類型

多態(tài)與多態(tài)性

多態(tài)指的是一類事物有多種形態(tài),比如動(dòng)物有多種形態(tài):貓、狗、豬

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、紫金網(wǎng)絡(luò)推廣、小程序設(shè)計(jì)、紫金網(wǎng)絡(luò)營(yíng)銷、紫金企業(yè)策劃、紫金品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供紫金建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com

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

#實(shí)例化得到三個(gè)對(duì)象
>>> cat=Cat()
>>> dog=Dog()
>>> pig=Pig()

插圖:惡搞圖34
09-04 多態(tài)性與鴨子類型

多態(tài)性指的是可以在不用考慮對(duì)象具體類型的情況下而直接使用對(duì)象,這就需要在設(shè)計(jì)時(shí),把對(duì)象的使用方法統(tǒng)一成一種:例如cat、dog、pig都是動(dòng)物,但凡是動(dòng)物肯定有talk方法,于是我們可以不用考慮它們?nèi)叩木唧w是什么類型的動(dòng)物,而直接使用

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

更進(jìn)一步,我們可以定義一個(gè)統(tǒng)一的接口來(lái)使用

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

插圖:惡搞圖35
09-04 多態(tài)性與鴨子類型

Python中一切皆對(duì)象,本身就支持多態(tài)性

# 我們可以在不考慮三者類型的情況下直接使用統(tǒng)計(jì)三個(gè)對(duì)象的長(zhǎng)度
s.__len__()
l.__len__()
t.__len__()

# Python內(nèi)置了一個(gè)統(tǒng)一的接口
len(s)
len(l)
len(t)

插圖:惡搞圖36
09-04 多態(tài)性與鴨子類型

多態(tài)性的好處在于增強(qiáng)了程序的靈活性和可擴(kuò)展性,比如通過(guò)繼承Animal類創(chuàng)建了一個(gè)新的類,實(shí)例化得到的對(duì)象obj,可以使用相同的方式使用obj.talk()

>>> class Wolf(Animal): #動(dòng)物的另外一種形態(tài):狼
...     def talk(self):
...         print('嗷...')
... 
>>> wolf=Wolf() # 實(shí)例出一頭狼
>>> wolf.talk() # 使用者根本無(wú)需關(guān)心wolf是什么類型而調(diào)用talk
嗷...

插圖:惡搞圖37
09-04 多態(tài)性與鴨子類型

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

import abc

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

class Cat(Animal): # 但凡繼承Animal的子類都必須遵循Animal規(guī)定的標(biāo)準(zhǔn)
    def talk(self):
        pass

cat=Cat() # 若子類中沒(méi)有一個(gè)名為talk的方法則會(huì)拋出異常TypeError,無(wú)法實(shí)例化

插圖:惡搞圖38
09-04 多態(tài)性與鴨子類型

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

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

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

插圖:惡搞圖39
09-04 多態(tài)性與鴨子類型


網(wǎng)站題目:09-04多態(tài)性與鴨子類型
文章鏈接:http://weahome.cn/article/pcodij.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部