日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

封装,多态,类的约束,super()深入了解

發(fā)布時間:2025/4/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 封装,多态,类的约束,super()深入了解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

python面向?qū)ο蟮娜筇匦?#xff1a;繼承,封裝,多態(tài)。

1. 封裝: 把很多數(shù)據(jù)封裝到?個對象中. 把固定功能的代碼封裝到?個代碼塊, 函數(shù), 對象, 打包成模塊. 這都屬于封裝的思想. 具體的情況具體分析. 比如. 寫了?個函數(shù). 那這個也可以被稱為封裝. 在?向?qū)ο笏枷胫? 是把?些看似?關(guān)緊要的內(nèi)容組合到?起統(tǒng)?進(jìn)?存儲和使?. 這就是封裝.

2. 繼承: ?類可以?動擁有?類中除了私有屬性外的其他所有內(nèi)容. 說?了, ??可以隨便?爹的東?. 但是?定要認(rèn)清楚?個事情. 必須先有爹, 后有??. 順序不能亂, 在python中實現(xiàn)繼承非常簡單. 在聲明類的時候, 在類名后?添加?個?括號,就可以完成繼承關(guān)系. 那么什么情況可以使?繼承呢? 單純的從代碼層?上來看. 兩個類具有相同的功能或者特征的時候. 可以采?繼承的形式. 提取?個?類, 這個?類中編寫著兩個類相同的部分. 然后兩個類分別取繼承這個類就可以了. 這樣寫的好處是可以避免寫很多重復(fù)的功能和代碼. 如果從語義中去分析的話. 會簡單很多. 如果語境中出現(xiàn)了x是?種y. 這時, y是?種泛化的概念. x比y更加具體. 那這時x就是y的?類. 比如. 貓是?種動物. 貓繼承動物. 動物能動. 貓也能動. 這時貓在創(chuàng)建的時候就有了動物的"動"這個屬性. 再比如, ?骨精是?個妖怪. 妖怪天?就有?個比較不好的功能叫"吃?", ?骨精?出?就知道如何"吃?". 此時 ?骨精繼承妖精.

3. 多態(tài): 同?個對象, 多種形態(tài). 這個在python中其實是很不容易說明?的. 比如. 創(chuàng)建?個變量a = 10 , 此時a是整數(shù)類型. 但是可以通過程序讓a = "abc", 這時, a?變成了字符串類型. 這個就是多態(tài)性. 同?個變量a可以是多種形態(tài)。

一 封裝

封裝,顧名思義就是將內(nèi)容封裝到某個地方,以后再去調(diào)用被封裝在某處的內(nèi)容。

所以,在使用面向?qū)ο蟮姆庋b特性時,需要:

  • 將內(nèi)容封裝到某處
  • 從某處調(diào)用被封裝的內(nèi)容

第一步:將內(nèi)容封裝到某處

self 是一個形式參數(shù),當(dāng)執(zhí)行 obj1 = Foo('a', 18 ) 時,self 等于 obj1,當(dāng)執(zhí)行 obj2 = Foo('b', 78 ) 時,self 等于 obj2,所以,內(nèi)容其實被封裝到了對象 obj1 和 obj2 中,每個對象中都有 name 和 age 屬性,在內(nèi)存里類似于下圖來保存。

第二步:從某處調(diào)用被封裝的內(nèi)容

調(diào)用被封裝的內(nèi)容時,有兩種情況:

  • 通過對象直接調(diào)用
  • 通過self間接調(diào)用

1、通過對象直接調(diào)用被封裝的內(nèi)容

對象 obj1 和 obj2 在內(nèi)存中保存的方式,根據(jù)保存格式可以如此調(diào)用被封裝的內(nèi)容:對象.屬性名

class Foo:def __init__(self, name, age):self.name =nameself.age =age obj1 =Foo('a', 18) print obj1.name # 直接調(diào)用obj1對象的name屬性printobj1.age # 直接調(diào)用obj1對象的age屬性obj2 =Foo('b', 73) print obj2.name # 直接調(diào)用obj2對象的name屬性 print obj2.age # 直接調(diào)用obj2對象的age屬性

2、通過self間接調(diào)用被封裝的內(nèi)容

執(zhí)行類中的方法時,需要通過self間接調(diào)用被封裝的內(nèi)容

class Foo:def __init__(self, name, age):self.name =nameself.age =agedef detail(self):print self.name print self.age obj1 =Foo('a', 18) obj1.detail() # Python默認(rèn)會將obj1傳給self參數(shù),即:obj1.detail(obj1),所以,此時方法內(nèi)部的 self = obj1,即:self.name 是a ;self.age 是 18 obj2 = Foo('b', 73) obj2.detail() # Python默認(rèn)會將obj2傳給self參數(shù),即:obj1.detail(obj2),所以,此時方法內(nèi)部的 self = obj2,即:self.name 是 b ; self.age 是 73

綜上所述,對于面向?qū)ο蟮姆庋b來說,其實就是使用構(gòu)造方法將內(nèi)容封裝到 對象 中,然后通過對象直接或者self間接獲取被封裝的內(nèi)容。

二 多態(tài)

多態(tài),同一個對象,多種形態(tài)。python默認(rèn)支持多態(tài)。
在java或者c#定義變量或者給函數(shù)傳值必須定義數(shù)據(jù)類型,否則就報錯。

def func(int a):print('a必須是數(shù)字') 而類似于python這種弱定義類語言,a可以是任意形態(tài)(str,int,object等等)。 def func(a):print('a是什么都可以')

再比如:

class F1:pass class S1(F1):def show(self):print 'S1.show' class S2(F1):def show(self):print 'S2.show'

由于在Java或C#中定義函數(shù)參數(shù)時,必須指定參數(shù)的類型
為了讓Func函數(shù)既可以執(zhí)行S1對象的show方法,又可以執(zhí)行S2對象的show方法,所以,定義了一個S1和S2類的父類
而實際傳入的參數(shù)是:S1對象和S2對象

def Func(F1 obj): """Func函數(shù)需要接收一個F1類型或者F1子類的類型"""print obj.show()s1_obj = S1() Func(s1_obj) # 在Func函數(shù)中傳入S1類的對象 s1_obj,執(zhí)行 S1 的show方法,結(jié)果:S1.shows2_obj = S2() Func(s2_obj) # 在Func函數(shù)中傳入Ss類的對象 ss_obj,執(zhí)行 Ss 的show方法,結(jié)果:S2.show Python偽代碼實現(xiàn)Java或C # 的多態(tài)

python中有一句諺語說的好,你看起來像鴨子,那么你就是鴨子。
對于代碼上的解釋其實很簡答:

class A:def f1(self):print('in A f1')def f2(self):print('in A f2') class B:def f1(self):print('in A f1')def f2(self):print('in A f2')obj = A() obj.f1() obj.f2()obj2 = B() obj2.f1() obj2.f2()

A 和 B兩個類完全沒有耦合性,但是在某種意義上他們卻統(tǒng)一了一個標(biāo)準(zhǔn)。
對相同的功能設(shè)定了相同的名字,這樣方便開發(fā),這兩個方法就可以互成為鴨子類型。
這樣的例子比比皆是:str tuple list 都有 index方法,這就是統(tǒng)一了規(guī)范。
str bytes 等等 這就是互稱為鴨子類型。

三 .類的約束

約束是對類的約束.

用一個例子說話:

公司讓小明給他們的網(wǎng)站完善一個支付功能,小明寫了兩個類,如下:

class QQpay:def pay(self,money):print('使用qq支付%s元' % money)class Alipay:def pay(self,money):print('使用阿里支付%s元' % money)a = Alipay() a.pay(100)b = QQpay() b.pay(200)

但是上面這樣寫不太放方便,也不合理,老大說讓他整改,統(tǒng)一一下付款的方式,小明開始加班整理:

class QQpay:def pay(self,money):print('使用qq支付%s元' % money)class Alipay:def pay(self,money):print('使用阿里支付%s元' % money)def pay(obj,money): # 這個函數(shù)就是統(tǒng)一支付規(guī)則,這個叫做: 歸一化設(shè)計。obj.pay(money)a = Alipay() b = QQpay()pay(a,100) pay(b,200)

寫了半年的接口,小明終于接了大項目了,結(jié)果公司沒品位,招了一個野生的程序員春哥接替小明的工作,老大給春哥安排了任務(wù),讓他寫一個微信支付的功能:

class QQpay:def pay(self,money):print('使用qq支付%s元' % money) class Alipay:def pay(self,money):print('使用阿里支付%s元' % money)class Wechatpay: # 野生程序員一般不會看別人怎么寫,自己才是最好,結(jié)果......def fuqian(self,money):print('使用微信支付%s元' % money)def pay(obj,money):obj.pay(money)a = Alipay() b = QQpay()pay(a,100) pay(b,200)c = Wechatpay() c.fuqian(300)

結(jié)果春哥重新梳理的代碼:

class Payment:   """ 此類什么都不做,就是制定一個標(biāo)準(zhǔn),誰繼承我,必須定義我里面的方法。 """def pay(self,money):passclass QQpay(Payment):def pay(self,money):print('使用qq支付%s元' % money) class Alipay(Payment):def pay(self,money):print('使用阿里支付%s元' % money) class Wechatpay(Payment):def fuqian(self,money):print('使用微信支付%s元' % money) def pay(obj,money):obj.pay(money)a = Alipay() b = QQpay()pay(a,100) pay(b,200)c = Wechatpay() c.fuqian(300)

但是,這樣還會有問題,如果再來野生程序員,他不看其他的支付方式,也不知道為什么繼承的類中要定義一個沒有意義的方法,所以他會我行我素:

class Payment: """ 此類什么都不做,就是制定一個標(biāo)準(zhǔn),誰繼承我,必須定義我里面的方法。"""def pay(self,money):pass class QQpay(Payment):def pay(self,money):print('使用qq支付%s元' % money) class Alipay(Payment):def pay(self,money):print('使用阿里支付%s元' % money) class Wechatpay(Payment):def fuqian(self,money):print('使用微信支付%s元' % money) def pay(obj,money):obj.pay(money)a = Alipay() b = QQpay()pay(a,100) pay(b,200)c = Wechatpay() c.fuqian(300)

所以此時要用到對類的約束,對類的約束有兩種:

\1. 提取?類. 然后在?類中定義好?法. 在這個?法中什么都不??. 就拋?個異常就可以了. 這樣所有的?類都必須重寫這個?法. 否則. 訪問的時候就會報錯.

\2. 使?元類來描述?類. 在元類中給出?個抽象?法. 這樣?類就不得不給出抽象?法的具體實現(xiàn). 也可以起到約束的效果.

先用第一種方式解決:

class Payment:"""此類什么都不做,就是制定一個標(biāo)準(zhǔn),誰繼承我,必須定義我里面的方法。"""def pay(self,money):raise Exception("你沒有實現(xiàn)pay方法")class QQpay(Payment):def pay(self,money):print('使用qq支付%s元' % money)class Alipay(Payment):def pay(self,money):print('使用阿里支付%s元' % money)class Wechatpay(Payment):def fuqian(self,money):print('使用微信支付%s元' % money)def pay(obj,money):obj.pay(money)a = Alipay() b = QQpay() c = Wechatpay() pay(a,100) pay(b,200) pay(c,300)

第二種方式:引入抽象類的概念處理。

from abc import ABCMeta,abstractmethod class Payment(metaclass=ABCMeta): # 抽象類 接口類 規(guī)范和約束 metaclass指定的是一個元類@abstractmethoddef pay(self):pass # 抽象方法class Alipay(Payment):def pay(self,money):print('使用支付寶支付了%s元'%money)class QQpay(Payment):def pay(self,money):print('使用qq支付了%s元'%money)class Wechatpay(Payment):# def pay(self,money):# print('使用微信支付了%s元'%money)def recharge(self):passdef pay(a,money):a.pay(money)a = Alipay() a.pay(100) pay(a,100) # 歸一化設(shè)計:不管是哪一個類的對象,都調(diào)用同一個函數(shù)去完成相似的功能 q = QQpay() q.pay(100) pay(q,100) w = Wechatpay() pay(w,100) # 到用的時候才會報錯 # 抽象類和接口類做的事情 :建立規(guī)范 # 制定一個類的metaclass是ABCMeta, # 那么這個類就變成了一個抽象類(接口類) # 這個類的主要功能就是建立一個規(guī)范

總結(jié): 約束. 其實就是?類對?類進(jìn)?約束. ?類必須要寫xxx?法. 在python中約束的?式和?法有兩種:

1. 使?抽象類和抽象?法, 由于該?案來源是java和c#. 所以使?頻率還是很少的

2. 使??為拋出異常的?案. 并且盡量拋出的是NotImplementError. 這樣比較專業(yè), ?且錯誤比較明確.(推薦)

四. super()深入了解

super是嚴(yán)格按照類的繼承順序執(zhí)行!!!

class A:def f1(self):print('in A f1')def f2(self):print('in A f2') class Foo(A):def f1(self):super().f2()print('in A Foo') obj = Foo() obj.f1() class A:def f1(self):print('in A') class Foo(A):def f1(self):super().f1()print('in Foo') class Bar(A):def f1(self):print('in Bar') class Info(Foo,Bar):def f1(self):super().f1()print('in Info f1') obj = Info() obj.f1() ''' in Bar in Foo in Info f1 ''' print(Info.mro()) # [<class '__main__.Info'>, <class '__main__.Foo'>, <class '__main__.Bar'>, <class '__main__.A'>, <class 'object'>] class A:def f1(self):print('in A') class Foo(A):def f1(self):super().f1()print('in Foo') class Bar(A):def f1(self):print('in Bar') class Info(Foo,Bar):def f1(self):super(Foo,self).f1()print('in Info f1') obj = Info() obj.f1()

轉(zhuǎn)載于:https://www.cnblogs.com/sundawei7/p/11316187.html

總結(jié)

以上是生活随笔為你收集整理的封装,多态,类的约束,super()深入了解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美性视频在线播放 | 911国产| 国产黄视频网站 | 久久色婷婷| 精品国产一区一区二区三亚瑟 | 大乳女喂男人吃奶视频 | 午夜亚洲国产 | 中文 欧美 日韩 | 伊人精品视频 | 波多野结衣亚洲视频 | 嘿咻视频在线观看 | 免费观看一区二区三区视频 | 亚洲美女福利视频 | 日本理论片午伦夜理片在线观看 | 久久天堂av综合合色蜜桃网 | 天天狠狠干 | 国产精品久久久久久免费观看 | 午夜视频导航 | 波多野结衣中文在线 | 97精品人妻一区二区 | 综合xx网 | 黄色免费网站在线 | 一级丰满大乳hd高清 | free性m.freesex欧美| 久热精品视频在线观看 | 一区二区三区在线观看免费 | 欧美色xxx | 色综合久久久久久 | 国产伦精品一区二区三区在线观看 | 亚洲第三十七页 | 在线观看视频一区二区 | 一区二区三区精品在线 | 有机z中国电影免费观看 | 亚洲美女中文字幕 | 涩涩网站视频 | 在线播放成人av | 草草福利影院 | 四虎永久免费观看 | 国产永久免费视频 | 日本少妇毛茸茸高潮 | 热逼视频 | 综合久久91 | 91精品免费视频 | 国产网站一区 | 国产精品人人爽 | 特级黄色录像 | 国产精品精品软件视频 | 欧美色影院 | 黄色一级免费大片 | 91久久久久久久久久久久久 | 天堂在线资源网 | 粗大的内捧猛烈进出视频 | 国产一区二区三区视频网站 | 午夜色播 | 亚洲AV无码AV吞精久久中文版 | 日本黄色录相 | 精品国产精品三级精品av网址 | 鲁一鲁一鲁一鲁一av | 亚洲精品一区二区三区四区五区 | 国产三级三级三级三级三级 | 在线婷婷| 8090理论片午夜理伦片 | v在线 | 日本天堂一区 | 日本在线高清 | 国产玖玖视频 | 国产鲁鲁视频在线观看特色 | 秋霞网一区二区三区 | 啪啪免费网站 | 亚洲国产精品无码久久久久高潮 | 成人精品av| 久99热| 久久网站视频 | 精品1卡二卡三卡四卡老狼 日韩三级网 | 污片视频在线观看 | 99精品无码一区二区 | 亚洲在线天堂 | 国产传媒在线观看 | 欧美精品久久久久久久免费 | 亚洲国产精品午夜久久久 | 亚洲成人系列 | 国产精品毛片一区 | 色屁屁在线| 中文字幕在线视频免费播放 | 老司机激情影院 | 91免费入口 | 日日操天天操 | 免费国产一区二区三区 | 97香蕉久久夜色精品国产 | 日韩视频在线观看一区二区三区 | 国外成人在线视频 | 亚洲区精品 | 国产另类av | 亚洲精品视频在线观看免费 | 丝袜诱惑一区二区 | 久久久久久久网 | 国产麻豆电影在线观看 | 日韩大片免费看 | 日韩在线视频一区 |