日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av在线www| 中文字幕国内自拍 | 99久久久无码国产精品性青椒 | 色久天| 黄色一集片 | 午夜一区二区三区在线 | 国产欧美一区二区三区在线看蜜臂 | 日韩欧美中文字幕一区二区三区 | 99热日韩 | 一区二区欧美在线 | 青青草在线视频免费观看 | 俄罗斯毛片| 中文字幕线人 | 黄页网站视频在线观看 | 亚洲50p| 影音先锋成人网 | 天天看天天射 | 国产精品女人久久久 | 91亚洲精品在线观看 | 麻豆视频在线观看免费网站 | 久久一区二区视频 | 日本a级网站 | 成人精品一区二区三区电影黑人 | 欧美午夜一区 | 五月婷婷亚洲 | 久草新免费 | 国产精品一区二区无线 | 成片免费观看视频 | 少妇高潮淫片免费观看 | 中文在线а√在线8 | 欧美一级特黄视频 | 狠狠操免费视频 | 91 高清 在线 制服 偷拍 | 亚洲一级特黄 | 久久久久久国产精品免费免费 | 国产精品aⅴ| av五月天在线 | 青青青国内视频在线观看软件 | 亚洲精品国产精品乱码不卡 | 韩国三级做爰视频 | 少妇人妻无码专区视频 | 欧美人与性动交α欧美片 | 91视频官网 | 一本大道久久久久精品嫩草 | 国产激情视频网站 | 高清18麻豆 | 免费在线观看成年人视频 | 91免费视频| 日韩一区二区三区免费 | 91欧美亚洲 | 日本中文字幕视频在线 | 欧美天堂在线观看 | 欧洲美一区二区三区亚洲 | 先锋影音av资源网站 | 中国免费毛片 | 中文字幕25页 | 欧美日韩激情视频在线观看 | 丁香九月激情 | 伊人365| 亚洲成人另类 | 精品国产伦一区 | 黄色日比视频 | 超碰人人国产 | 免费a在线观看播放 | 国产尻逼| 五月天国产在线 | 羞辱狗奴的句子有哪些 | 女同性恋一区二区三区 | 在线观看9.1| 国产卡一卡二在线 | 国产福利在线视频 | 亚洲成av人片在www色猫咪 | 日本真人做爰免费视频120秒 | 中文字幕亚洲无线码在线一区 | 黄色在线免费网站 | 国产寡妇亲子伦一区二区三区四区 | 黄色最新网址 | 在线免费观看黄视频 | 中文字幕永久在线观看 | 自拍视频网址 | 国产激情无套内精对白视频 | 九九资源网 | 久久av免费观看 | 日韩亚州 | 噜噜av | 欧美极品喷水 | 69av一区二区三区 | 午夜成人免费视频 | 日韩在线观看视频免费 | 成人国产精品免费 | 日韩中字在线 | 日本乱淫视频 | 国产麻豆剧传媒精品国产av | 在线观看a网站 | 国产精品久久久久久精 | 依依成人综合 | 性视频播放免费视频 | 国精产品一品二品国精品69xx | 精品玖玖玖|