您好,登錄后才能下訂單哦!
@property
類的靜態(tài)屬性,封裝內(nèi)部具體實(shí)現(xiàn)細(xì)節(jié),調(diào)用的時(shí)候類似調(diào)用數(shù)據(jù)屬性。既可以訪問(wèn)類屬性,也可以訪問(wèn)實(shí)例屬性
![](https://s1.51cto.com/images/blog/201906/08/6de11e5b657bbb1c6e02f4ed64821fa7.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
@classmethod
類方法
![](https://s1.51cto.com/images/blog/201906/08/d36f46a721750e99047808d30276f111.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
@staticmethod
類的工具包,不能使用類變量和實(shí)例變量
第二種
繼承、多態(tài)、封裝
多態(tài):在不同的類實(shí)例化得到的對(duì)象,調(diào)用同一個(gè)方法,執(zhí)行的邏輯不同
封裝:
封裝數(shù)據(jù):將數(shù)據(jù)隱藏起來(lái)這不是目的。隱藏起來(lái)然后對(duì)外提供操作該數(shù)據(jù)的接口,然后我們可以在接口附加上對(duì)該數(shù)據(jù)操作的限制,以此完成對(duì)數(shù)據(jù)屬性操作的嚴(yán)格控制。
封裝方法:目的是隔離復(fù)雜度
封裝在于明確區(qū)分內(nèi)外,使得類實(shí)現(xiàn)者可以修改封裝內(nèi)的東西而不影響外部調(diào)用者的代碼;而外部使用用者只知道一個(gè)接口(函數(shù)),只要接口(函數(shù))名、參數(shù)不變,使用者的代碼永遠(yuǎn)無(wú)需改變。這就提供一個(gè)良好的合作基礎(chǔ)——或者說(shuō),只要接口這個(gè)基礎(chǔ)約定不變,則代碼改變不足為慮。
反射 主要是指程序可以訪問(wèn)、檢測(cè)和修改它本身狀態(tài)或行為的一種能力(自?。?。
`getattr(object, name, default=None)```:判斷object中有沒(méi)有一個(gè)name字符串對(duì)應(yīng)的方法或?qū)傩?/p>
hasattr(object,'name')?。z測(cè)是否含有某屬性
setattr(object,name,True) ?。≡O(shè)置屬性\
delattr(object,'name') - 刪除屬性
基于反射- 動(dòng)態(tài)導(dǎo)入模塊
getattr , delattr , setattr
getattr :一個(gè)對(duì)象在調(diào)不存在的屬性時(shí)候,就會(huì)自動(dòng)觸發(fā)。
delattr : 一個(gè)對(duì)象刪除類屬性或?qū)ο髮傩詴r(shí)候,會(huì)觸發(fā)
setattr : 在設(shè)置屬性或新增屬性時(shí)候,默認(rèn)就會(huì)觸發(fā) setattr ,如果在創(chuàng)建類的時(shí)候重新定義了setattr方法,要寫(xiě)上操作屬性字典代碼,不寫(xiě)就增加屬性不成功
利用上述幾個(gè)內(nèi)置方法,可以二次加工標(biāo)準(zhǔn)類型。比如重新定義setattr,在新增屬性之前加點(diǎn)自定義參數(shù)
包裝一個(gè)類型通常是對(duì)已存在的類型的一些定制,這種做法可以新建,修改或刪除原有產(chǎn)品的功能。其它的則保持原樣。授權(quán)的過(guò)程,即是所有更新的功能都是由新類的某部分來(lái)處理,但已存在的功能就授權(quán)給對(duì)象的默認(rèn)屬性。
實(shí)現(xiàn)授權(quán)的關(guān)鍵點(diǎn)就是覆蓋getattr方法
setitem,getitem,delitem 用字典方式調(diào)用屬性的時(shí)候就會(huì)觸發(fā)。如:kk['name']
用點(diǎn)(.)方式調(diào)用屬性會(huì)觸發(fā) getattr等方法。如:kk.name
str,repr,:改變對(duì)象的字符串顯示str,repr
自定制格式化字符串format
str函數(shù)或者print函數(shù)--->obj.str()
repr或者交互式解釋器--->obj.repr()
如果str沒(méi)有被定義,那么就會(huì)使用repr來(lái)代替輸出
注意:這倆方法的返回值必須是字符串,否則拋出異常
slots是一個(gè)類變量,變量值可以是列表,元祖,或者可迭代對(duì)象,也可以是一個(gè)字符串(意味著所有實(shí)例只有一個(gè)數(shù)據(jù)屬性)
使用點(diǎn)來(lái)訪問(wèn)屬性本質(zhì)就是在訪問(wèn)類或者對(duì)象的dict屬性字典(類的字典是共享的,而每個(gè)實(shí)例的是獨(dú)立的),字典會(huì)占用大量?jī)?nèi)存,如果有一個(gè)類,屬性很少,但是實(shí)例很多,為了節(jié)省內(nèi)存可以使用slots取代實(shí)例的dict。(可以說(shuō)是用來(lái)作為一個(gè)內(nèi)存優(yōu)化工具)
定義了slots后的類不再 支持一些普通類特性了,比如多繼承
析構(gòu)方法,當(dāng)對(duì)象在內(nèi)存中被釋放時(shí),自動(dòng)觸發(fā)執(zhí)行。
注:如果產(chǎn)生的對(duì)象僅僅只是python程序級(jí)別的(用戶級(jí)),那么無(wú)需定義del,如果產(chǎn)生的對(duì)象的同時(shí)還會(huì)向操作系統(tǒng)發(fā)起系統(tǒng)調(diào)用,即一個(gè)對(duì)象有用戶級(jí)與內(nèi)核級(jí)兩種資源,比如(打開(kāi)一個(gè)文件,創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)鏈接),則必須在清除對(duì)象的同時(shí)回收系統(tǒng)資源,這就用到了del
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。