黄视频网站在线免费观看-黄视频网站在线看-黄视频网站在线观看-黄视频网站免费看-黄视频网站免费观看-黄视频网站免费

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機構(gòu)

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術(shù)干貨  > Python中的魔術(shù)方法詳解

Python中的魔術(shù)方法詳解

來源:千鋒教育
發(fā)布人:xqq
時間: 2023-11-08 02:35:12 1699382112

Python中,所有以“__”雙下劃線包起來的方法,都統(tǒng)稱為“MagicMethod”,中文稱『魔術(shù)方法』,例如類的初始化方法__init__,Python中所有的魔術(shù)方法均在官方文檔中有相應描述,但是對于官方的描述比較混亂而且組織比較松散。很難找到有一個例子。

構(gòu)造和初始化

每個Pythoner都知道一個最基本的魔術(shù)方法,__init__。通過此方法我們可以定義一個對象的初始操作。然而,當調(diào)用x=SomeClass()的時候,__init__并不是第一個被調(diào)用的方法。實際上,還有一個叫做__new__的方法,兩個共同構(gòu)成了“構(gòu)造函數(shù)”。

__new__是用來創(chuàng)建類并返回這個類的實例,而__init__只是將傳入的參數(shù)來初始化該實例。

在對象生命周期調(diào)用結(jié)束時,__del__方法會被調(diào)用,可以將__del__理解為“構(gòu)析函數(shù)”。下面通過代碼的看一看這三個方法:

fromos.pathimportjoin

classFileObject:

'''給文件對象進行包裝從而確認在刪除時文件流關(guān)閉'''

def__init__(self,filepath='~',filename='sample.txt'):

#讀寫模式打開一個文件

self.file=open(join(filepath,filename),'r+')

def__del__(self):

self.file.close()

delself.file

控制屬性訪問

許多從其他語言轉(zhuǎn)到Python的人會抱怨它缺乏類的真正封裝。(沒有辦法定義私有變量,然后定義公共的getter和setter)。Python其實可以通過魔術(shù)方法來完成封裝。我們來看一下:

1__getattr__(self,name):

定義當用戶試圖獲取一個不存在的屬性時的行為。這適用于對普通拼寫錯誤的獲取和重定向,對獲取一些不建議的屬性時候給出警告(如果你愿意你也可以計算并且給出一個值)或者處理一個AttributeError。只有當調(diào)用不存在的屬性的時候會被返回。

1__setattr__(self,name,value):

與__getattr__(self,name)不同,__setattr__是一個封裝的解決方案。無論屬性是否存在,它都允許你定義對對屬性的賦值行為,以為這你可以對屬性的值進行個性定制。實現(xiàn)__setattr__時要避免"無限遞歸"的錯誤。

1__delattr__:

與__setattr__相同,但是功能是刪除一個屬性而不是設(shè)置他們。實現(xiàn)時也要防止無限遞歸現(xiàn)象發(fā)生。

1__getattribute__(self,name):

__getattribute__定義了你的屬性被訪問時的行為,相比較,__getattr__只有該屬性不存在時才會起作用。因此,在支持__getattribute__的Python版本,調(diào)用__getattr__前必定會調(diào)用__getattribute__。__getattribute__同樣要避免"無限遞歸"的錯誤。需要提醒的是,最好不要嘗試去實現(xiàn)__getattribute__,因為很少見到這種做法,而且很容易出bug。

在進行屬性訪問控制定義的時候很可能會很容易引起“無限遞歸”。如下面代碼:

#錯誤用法

def__setattr__(self,name,value):

self.name=value

#每當屬性被賦值的時候(如self.name=value),__setattr__()會被調(diào)用,這樣就造成了遞歸調(diào)用。

#這意味這會調(diào)用self.__setattr__('name',value),每次方法會調(diào)用自己。這樣會造成程序崩潰。

#正確用法

def__setattr__(self,name,value):

self.__dict__[name]=value#給類中的屬性名分配值

#定制特有屬性

Python的魔術(shù)方法很強大,但是用時卻需要慎之又慎,了解正確的使用方法非常重要。

創(chuàng)建自定義容器

有很多方法可以讓你的Python類行為向內(nèi)置容器類型一樣,比如我們常用的list、dict、tuple、string等等。Python的容器類型分為可變類型(如list、dict)和不可變類型(如string、tuple),可變?nèi)萜骱筒豢勺內(nèi)萜鞯膮^(qū)別在于,不可變?nèi)萜饕坏┵x值后,不可對其中的某個元素進行修改。

在講創(chuàng)建自定義容器之前,應該先了解下協(xié)議。這里的協(xié)議跟其他語言中所謂的"接口"概念很像,它給你很多你必須定義的方法。然而在Python中的協(xié)議是很不正式的,不需要明確聲明實現(xiàn)。事實上,他們更像一種指南。

自定義容器的magicmethod

下面細致了解下定義容器可能用到的魔術(shù)方法。首先,實現(xiàn)不可變?nèi)萜鞯脑?,你只能定義__len__和__getitem__(下面會講更多)。可變?nèi)萜鲄f(xié)議則需要所有不可變?nèi)萜鞯乃校硗膺€需要__setitem__和__delitem__。如果你希望你的對象是可迭代的話,你需要定義__iter__會返回一個迭代器。迭代器必須遵循迭代器協(xié)議,需要有__iter__(返回它本身)和next。

1__len__(self):

返回容器的長度。對于可變和不可變?nèi)萜鞯膮f(xié)議,這都是其中的一部分。

1__getitem__(self,key):

定義當某一項被訪問時,使用self[key]所產(chǎn)生的行為。這也是不可變?nèi)萜骱涂勺內(nèi)萜鲄f(xié)議的一部分。如果鍵的類型錯誤將產(chǎn)生TypeError;如果key沒有合適的值則產(chǎn)生KeyError。

1__setitem__(self,key,value):

當你執(zhí)行self[key]=value時,調(diào)用的是該方法。

1__delitem__(self,key):

定義當一個項目被刪除時的行為(比如delself[key])。這只是可變?nèi)萜鲄f(xié)議中的一部分。當使用一個無效的鍵時應該拋出適當?shù)漠惓!?/p>

1__iter__(self):

返回一個容器迭代器,很多情況下會返回迭代器,尤其是當內(nèi)置的iter()方法被調(diào)用的時候,以及當使用forxincontainer:方式循環(huán)的時候。迭代器是它們本身的對象,它們必須定義返回self的__iter__方法。

1__reversed__(self):

實現(xiàn)當reversed()被調(diào)用時的行為。應該返回序列反轉(zhuǎn)后的版本。僅當序列可以是有序的時候?qū)崿F(xiàn)它,例如對于列表或者元組。

1__contains__(self,item):

定義了調(diào)用in和notin來測試成員是否存在的時候所產(chǎn)生的行為。你可能會問為什么這個不是序列協(xié)議的一部分?因為當__contains__沒有被定義的時候,如果沒有定義,那么Python會迭代容器中的元素來一個一個比較,從而決定返回True或者False。

1__missing__(self,key):

dict字典類型會有該方法,它定義了key如果在容器中找不到時觸發(fā)的行為。比如d={'a':1},當你執(zhí)行d[notexist]時,d.__missing__['notexist']就會被調(diào)用。

以上內(nèi)容為大家介紹了Python中的魔術(shù)方法詳解,希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓機構(gòu):千鋒教育。

tags: python培訓
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內(nèi)將與您1V1溝通
免費領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學 138****2860 剛剛成功領(lǐng)取
王同學 131****2015 剛剛成功領(lǐng)取
張同學 133****4652 剛剛成功領(lǐng)取
李同學 135****8607 剛剛成功領(lǐng)取
楊同學 132****5667 剛剛成功領(lǐng)取
岳同學 134****6652 剛剛成功領(lǐng)取
梁同學 157****2950 剛剛成功領(lǐng)取
劉同學 189****1015 剛剛成功領(lǐng)取
張同學 155****4678 剛剛成功領(lǐng)取
鄒同學 139****2907 剛剛成功領(lǐng)取
董同學 138****2867 剛剛成功領(lǐng)取
周同學 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
国产原创视频在线| 久久成人综合网| 国产网站在线| 国产欧美精品午夜在线播放| 国产福利免费视频| 国产高清在线精品一区二区| 精品视频一区二区三区免费| 四虎影视库| 国产一区二区精品久久91| 久久精品免视看国产明星| 人人干人人插| 天天做日日干| 一级片片| 久久精品欧美一区二区| 国产国产人免费视频成69堂| 久久99欧美| 国产麻豆精品免费密入口| 精品国产亚洲人成在线| 精品视频免费在线| 国产视频在线免费观看| 免费一级片在线观看| 免费的黄色小视频| 国产麻豆精品视频| 欧美爱色| 欧美大片毛片aaa免费看| 欧美日本二区| 欧美激情一区二区三区视频 | 黄视频网站免费看| 日韩专区第一页| 精品国产香蕉在线播出| 黄视频网站在线看| 国产综合成人观看在线| 国产激情一区二区三区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 高清一级做a爱过程不卡视频| 日韩免费在线视频| 久久国产精品自线拍免费| 成人免费一级毛片在线播放视频| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产精品免费精品自在线观看| 国产一级生活片| 国产欧美精品午夜在线播放| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 九九免费高清在线观看视频 | 韩国毛片基地| 久久国产精品永久免费网站| 99色视频在线观看| 黄视频网站在线看| 日韩一级黄色片| 国产伦久视频免费观看 视频| 日韩在线观看视频免费| 亚洲wwwwww| 日韩在线观看网站| 精品视频在线观看视频免费视频| 九九九网站| 黄视频网站在线看| 国产原创中文字幕| 欧美国产日韩精品| 国产一区二区精品久| 成人免费网站视频ww| 美女被草网站| 国产一区免费在线观看| 亚洲 欧美 成人日韩| 国产原创中文字幕| 精品国产亚洲人成在线| 国产精品1024在线永久免费| 久久99欧美| 欧美电影免费| 国产欧美精品午夜在线播放| 在线观看成人网| 韩国毛片| 日本伦理黄色大片在线观看网站| 亚洲精品影院| 精品视频免费在线| 欧美爱爱网| 国产91精品露脸国语对白| 精品视频免费在线| 尤物视频网站在线| 日韩av成人| 九九热国产视频| 午夜在线亚洲| 欧美激情一区二区三区在线播放 | 99热精品一区| 久久国产一久久高清| 免费毛片播放| 高清一级淫片a级中文字幕| 欧美大片毛片aaa免费看| 精品久久久久久中文字幕一区| 国产一级生活片| 成人av在线播放| 精品在线观看一区| 国产不卡精品一区二区三区| 亚洲第一页色| 在线观看成人网| 精品视频在线观看一区二区| 91麻豆高清国产在线播放| 可以在线看黄的网站| 国产麻豆精品高清在线播放| 国产精品自拍在线| 高清一级毛片一本到免费观看| 久草免费在线观看| 日韩一级黄色| 久久国产一区二区| 国产亚洲精品aaa大片| 欧美激情一区二区三区在线| 黄色免费三级| 亚洲精品中文一区不卡| 亚洲女人国产香蕉久久精品| 国产极品精频在线观看| 九九精品久久| 欧美一级视| 麻豆网站在线看| 免费一级片在线| 四虎影视库| 久久精品欧美一区二区| 精品视频在线观看一区二区| 国产美女在线观看| 国产伦精品一区二区三区无广告| 精品国产一区二区三区精东影业| 亚洲第一页色| 成人高清视频免费观看| 亚洲第一色在线| a级黄色毛片免费播放视频| 国产伦精品一区二区三区无广告| 成人免费一级纶理片| 国产网站在线| 久久成人综合网| 日日夜夜婷婷| 99久久精品国产麻豆| 日韩一级黄色片| 黄色免费三级| 可以免费在线看黄的网站| 久久国产一久久高清| 国产不卡在线观看| 日本特黄特黄aaaaa大片| 精品国产一区二区三区精东影业| 国产麻豆精品高清在线播放| 在线观看成人网 | 国产a毛片| 成人免费一级毛片在线播放视频| 九九热国产视频| 国产网站在线| 日本特黄一级| 四虎影视久久久| 天天色成人网| 99热精品一区| 亚洲第一色在线| 国产国语对白一级毛片| 精品国产亚一区二区三区| 99热视热频这里只有精品| 天天色成人网| 国产极品白嫩美女在线观看看| 免费国产一级特黄aa大片在线| 日韩中文字幕在线播放| 国产亚洲免费观看| 毛片高清| 精品视频在线观看一区二区三区| 日韩一级黄色| 国产视频网站在线观看| 欧美激情一区二区三区中文字幕| 国产成a人片在线观看视频| 色综合久久天天综合绕观看 | 免费国产在线观看不卡| 久久国产影院| 亚洲精品久久久中文字| 美女免费毛片| 国产伦久视频免费观看视频| 免费国产在线观看| 人人干人人插| 999久久狠狠免费精品| 日本伦理网站| 国产不卡高清在线观看视频 | 免费毛片基地| 精品国产一区二区三区精东影业| 沈樵在线观看福利| 欧美激情中文字幕一区二区| 欧美大片毛片aaa免费看| 国产精品123| 欧美α片无限看在线观看免费| 999精品在线| 中文字幕97| 四虎影视久久久| 日本伦理片网站| 四虎影视久久| 日日日夜夜操| 国产麻豆精品| 国产精品免费久久| 色综合久久手机在线| 成人a大片在线观看| 欧美一级视| 国产网站在线| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 欧美激情一区二区三区在线| 四虎影视库| 欧美1区2区3区| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 色综合久久天天综合观看| 欧美激情一区二区三区在线播放 | 九九九国产| 99色视频|