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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

python常用魔法函数

發(fā)布時間:2023/11/28 生活经验 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python常用魔法函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、__init__():

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

?

?

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

?

不論怎么樣,顯示的初始化屬性是一個好習慣。

2、__str__():

直接打印對象的實現(xiàn)方法,__str__是被print函數(shù)調(diào)用的,一般都是return一個什么東西,這個東西應該是以字符串的形式表現(xiàn)的。如果不是要用str()函數(shù)轉(zhuǎn)換,我們可以直接print的對象都是實現(xiàn)了__str__這個方法的,比如dict。看下面的例子。

?

?

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

?

?

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

?

?

3、__new__():

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

?

?

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

?

?

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

?

?

這個就比較明顯了,另一個實例的__init__被調(diào)用了。

4、__unicode__():

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

?

在django中,雖然沒有定義__str__,但是django會將__unicode__轉(zhuǎn)為了str,當然你調(diào)用unicode更加是沒有問題的。

5、__call__():

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

?

?

可以看到,我們在像使用函數(shù)一樣使用類,實在是很有意思的事。

6、__len__():

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

?

?

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

?

?

7、__repr__():

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

?

?

8、__setattr__():

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

?

?

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

9、__getattr__()

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

?

第一個屬性可以找到,所以不會調(diào)__getattr__,第二個屬性找不到,所以會調(diào)用到。

10、__getattribute__():

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

?

11、__delattr__():

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

?

12、__setitem__():

該函數(shù)可以給對象賦值,我們可以以下標的方式對其進行操作,下面看個例子。

?

13、__getitem__():

與上函數(shù)相反,__getitem__可以使對象支持已下標的方式獲取值,例子如下:

?

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

14、__delitem__():

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

?

15、__iter__():

只要定義了__iter__()方法對象,就可以使用迭代器訪問,這意味著,我們可以迭代我們自己定義的對象,具體請看第三章,例子如下。

?

16、__del__():

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

?

可以看到,在對象不再被引用后,會運行__del__函數(shù)。

總結(jié)

以上是生活随笔為你收集整理的python常用魔法函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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