日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

16個(gè)python常用魔法函數(shù)

 印度阿三17 2019-08-12

1、__ init__():

所有類的超類object,有一個(gè)默認(rèn)包含pass的__ init __()實(shí)現(xiàn),這個(gè)函數(shù)會(huì)在對(duì)象初始化的時(shí)候調(diào)用,我們可以選擇實(shí)現(xiàn),也可以選擇不實(shí)現(xiàn),一般建議是實(shí)現(xiàn)的,不實(shí)現(xiàn)對(duì)象屬性就不會(huì)被初始化,雖然我們?nèi)匀豢梢詫?duì)其進(jìn)行賦值,但是它已經(jīng)成了隱式的了,編程時(shí)顯示遠(yuǎn)比隱式的更好,看下面的小栗子:

? image

我們可以通過vars函數(shù)獲知顯示聲明的屬性,但是隱式的就無法獲知了,這并不值得提倡,但是在知道參數(shù)的情況下我們還是可以對(duì)其進(jìn)行賦值的,如下:

? image

不論怎么樣,顯示的初始化屬性是一個(gè)好習(xí)慣。

2、__ str__():

直接打印對(duì)象的實(shí)現(xiàn)方法,__ str__是被print函數(shù)調(diào)用的,一般都是return一個(gè)什么東西,這個(gè)東西應(yīng)該是以字符串的形式表現(xiàn)的。如果不是要用str()函數(shù)轉(zhuǎn)換,我們可以直接print的對(duì)象都是實(shí)現(xiàn)了__ str__這個(gè)方法的,比如dict??聪旅娴睦?。

? image

__ str__是dict其中的一個(gè)方法,這個(gè)方法的實(shí)現(xiàn)賦予了它直接被print的能力,知道這些,我們就可以給自己的類定義這個(gè)方法使其可以print了,例子如下:

? image

但是這個(gè)函數(shù)返回值必須為string,否則會(huì)拋異常:

? image

3、__ new__():

在object類中存在一個(gè)靜態(tài)的__ new__(cls, *args, **kwargs)方法,該方法需要傳遞一個(gè)參數(shù)cls,cls表示需要實(shí)例化的類,此參數(shù)在實(shí)例化時(shí)由Python解釋器自動(dòng)提供,__ new__方法必須有返回值,且返回的是被實(shí)例化的實(shí)例,只有在該實(shí)例返回后才會(huì)調(diào)用__ init__來進(jìn)行初始化,初始化所用的實(shí)例就是__ new__返回的結(jié)果,也就可以認(rèn)為是self,我們來看下面的例子:

? image

可以看到,在實(shí)例化時(shí)候,先執(zhí)行__ new__再執(zhí)行__ init__,而且python會(huì)自動(dòng)傳入我們希望實(shí)例化的類,的這里我們顯示的調(diào)用了object的__ new__,也可以調(diào)用其他的父類的__ new__,那么如果我們定義了__ new__,但是并沒有返回一個(gè)本身實(shí)例,會(huì)發(fā)生什么事呢?例子如下:

? image

可以看到本身的__ init__函數(shù)并未被調(diào)用,而是調(diào)用了str的__ init__,可能這樣并不直觀,那么換一個(gè)實(shí)例返回,如下:

? image

這個(gè)就比較明顯了,另一個(gè)實(shí)例的__ init__被調(diào)用了。

4、__ unicode__():

__ unicode__()方法是在一個(gè)對(duì)象上調(diào)用unicode()時(shí)被調(diào)用的。因?yàn)镈jango的數(shù)據(jù)庫后端會(huì)返回Unicode字符串給model屬性,所以我們通常會(huì)給自己的model寫一個(gè)__ unicode__()方法。如果定義了__ unicode__()方法但是沒有定義__ str__()方法,Django會(huì)自動(dòng)提供一個(gè)__ str__()方法調(diào)用 __ unicode__()方法,然后把結(jié)果轉(zhuǎn)換為UTF-8編碼的字符串對(duì)象,所以在一般情況下,只定義__ unicode__()方法,讓 Django來處理字符串對(duì)象的轉(zhuǎn)換,看一個(gè)小栗子:

? image

在django中,雖然沒有定義__ str__,但是django會(huì)將__ unicode__轉(zhuǎn)為了str,當(dāng)然你調(diào)用unicode更加是沒有問題的。

5、__ call__():

對(duì)象通過提供call()方法可以模擬函數(shù)的行為,如果一個(gè)對(duì)象提供了該方法,就可以像函數(shù)一樣使用它,還是用例子進(jìn)行說明。

? image

可以看到,我們?cè)谙袷褂煤瘮?shù)一樣使用類,實(shí)在是很有意思的事。

6、__ len__():

len調(diào)用后會(huì)調(diào)用對(duì)象的__ len__函數(shù),我們可以為其定制輸出,如下例子:

? image

但是該函數(shù)要求我們返回的值必須為int,否則會(huì)報(bào)錯(cuò),如下:

? image

7、__ repr__():

函數(shù)str() 用于將值轉(zhuǎn)化為適于人閱讀的形式,而repr() 轉(zhuǎn)化為供解釋器讀取的形式,某對(duì)象沒有適于人閱讀的解釋形式的話,str() 會(huì)返回與repr(),所以print展示的都是str的格式。例子:

? image

8、__ setattr__():

該函數(shù)可以設(shè)置函數(shù)的屬性,文字不知怎么描述,直接上例子:

? image

從上例可以看出,__ setattr__函數(shù)可以支持對(duì)象增加屬性,我們可以有計(jì)劃的修改增加屬性的內(nèi)容。

9、__ getattr__()

獲取對(duì)象屬性,只有在屬性沒有找到的時(shí)候調(diào)用,還是看例子:

? image

第一個(gè)屬性可以找到,所以不會(huì)調(diào)__ getattr__,第二個(gè)屬性找不到,所以會(huì)調(diào)用到。

10、__ getattribute__():

該函數(shù)和上面介紹的__ getattr__很像,都是獲取屬性,但是__ getattr__是在屬性不存在時(shí)被調(diào)用,而__ getattribute__是無條件被調(diào)用,這樣會(huì)方便我們做一些控制,需要注意,一旦定義了__ getattribute__,則__ getattr__不再會(huì)被調(diào)用,除非顯式調(diào)用,例子如下:

? image

11、__ delattr__():

本函數(shù)的作用是刪除屬性,實(shí)現(xiàn)了該函數(shù)的類可以用del 命令來刪除屬性,下面還是看個(gè)例子。

? image

12、__ setitem__():

該函數(shù)可以給對(duì)象賦值,我們可以以下標(biāo)的方式對(duì)其進(jìn)行操作,下面看個(gè)例子。

? image

13、__ getitem__():

與上函數(shù)相反,__ getitem__可以使對(duì)象支持已下標(biāo)的方式獲取值,例子如下:

? image

這一類魔法函數(shù)對(duì)我們來說最大的好處是可以增加代碼的優(yōu)雅程度,并且可以方便的進(jìn)行流程的控制,上面的例子,我們向操作字典一樣在操作一個(gè)對(duì)象,并且在賦值與取值時(shí)都進(jìn)行了變更,實(shí)在是比較好玩。

14、__ delitem__():

該函數(shù)支持以下標(biāo)方式刪除對(duì)象數(shù)據(jù),實(shí)現(xiàn)了這三個(gè)函數(shù),這個(gè)類就像字典一樣,具備了基本的增刪查功能,有時(shí)候這樣寫會(huì)很方便。

? image

15、__ iter__():

只要定義了__ iter__()方法對(duì)象,就可以使用迭代器訪問,這意味著,我們可以迭代我們自己定義的對(duì)象,例子如下。

? image

16、__ del__():

這可以說是一個(gè)析構(gòu)器,或者回收器,在對(duì)象引用數(shù)降到0時(shí)執(zhí)行,有時(shí)可能還需要等一會(huì)再執(zhí)行,所以一般不推薦使用,但是在代碼中我們偶爾可以用它來實(shí)現(xiàn)一些必須要做的,但是并不緊急的事,下面是個(gè)例子。

? image

可以看到,在對(duì)象不再被引用后,會(huì)運(yùn)行__ del__函數(shù)



作者:我愛學(xué)python
鏈接:https://www.jianshu.com/p/3e70ed3558be
來源:簡(jiǎn)書
簡(jiǎn)書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。 來源:https://www./content-1-387601.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多