python的魔法函式

2021-10-01 21:26:32 字數 2495 閱讀 5552

所以還是老老實實的把自己的基本功練好,物件導向玩的爐火純青,其他的不過是稍加訓練,跟賣藝的學幾招也能稱霸一片天。哈哈 牛吹的太過了, 還是回到正題,總結分享一下一些稍微不太熟悉的魔法方法。

一、__str__():

它表示的是直接列印物件實現的方法,__str__是被print函式呼叫的, 一般都是返回乙個值, 這個值是以字串方式表現的,需要注意的是必須是返回乙個字串型別的,不然會丟擲異常:

這樣一來的話在物件導向中我們就可以按照自己的想法去列印我們想要的的結果了。

二、__call__():

物件通過__call__()的方法可以是物件模擬函式的行為,即具體在__call__函式裡面定義我們想要的的函式,或者返回傳入引數的倍數或者其他拼接的資訊等,這樣的效果是我們可以像使用函式一樣去使用類,也是一件很有意思的事。(嗯, 就像拖鞋不只是用來穿的)

三、__repr__():

與str類似, 但是str用於將值轉化為適合人閱讀的形式,但是repr轉化為的是供直譯器讀取的形式,區別就是後者在str()函式或者print函式列印乙個函式的時候被使用,且它返回的字串對終端使用者更友好,如果只想實現乙個,使用repr會更好,因為如果乙個物件沒有str函式,然而python又需要呼叫它的時候,直譯器會用repr作為替代去配合呼叫。常見的用法就是我需要輸出乙個自己加工的資料的時候,重寫這個方法,這樣再呼叫print()或者repr的方法時,就能調出我們期望的資料。

四、__setattr__():

該方法會攔截所有的賦值語句,如果定義了,self.attr = value就會變成self.__setattr__("attr", value), 需要注意的是當在__setattr__方法裡邊對屬性進行賦值的時候,不能使用self.attr = value, 因為會再次呼叫self.__setattr__("attr", value),導致堆疊溢位。應該使用self.__dict__['name'] = value即對屬性字典做索引運算來賦值。

常規對屬性賦值被賦值的屬性和值會存入例項屬性字典__dict__中

如果自定義了__setattr__,對例項屬性的賦值就會呼叫它。類定義中的self.attr也同樣,所以在__setattr__下還有self.attr的賦值操作就會出現無線遞迴的呼叫__setattr__的情況。自己實現__setattr__有很大風險,一般情況都還是繼承object類的__setattr__方法。

五、 __getattr__():

攔截點號運算。當對未定義屬性名稱和例項進行點號運算時,就會用屬性,名作為字串呼叫這個方法,如果繼承樹可以找到該屬性,則不呼叫。即當我們例項化乙個物件,當某屬性可以通過正常機制追溯到即在物件.__dict__中可以找到時,不會呼叫該方法。

六、__delattr__():

需要注意的是和__setattr__一樣,適用於刪除物件的某個屬性時才用到。

七、__eq__():

用來判斷兩個物件的值是否相等,"=="會觸發這個方法。

如果我們不重寫的話,會預設呼叫object中的__eq__方法, 那個比較嚴格,有時候不好判斷兩個物件是否相等, 這個會經常進行重寫。

好啦, 今天的魔法方法就分享到這吧,當然還有其他的魔法方法, 比如__class__, __doc__, __name__等其他方法,這些方法都是我們比較常用的,也就沒必要小猿在這裡再囉嗦一遍,希望能給在python或者其他語言帶來點啟發, 你的關注和感悟是小猿我分享知識,繼續推送的最大動力。大家一起努力。

python的魔法函式

所以還是老老實實的把自己的基本功練好,物件導向玩的爐火純青,其他的不過是稍加訓練,跟賣藝的學幾招也能稱霸一片天。哈哈 牛吹的太過了,還是回到正題,總結分享一下一些稍微不太熟悉的魔法方法。一 str 它表示的是直接列印物件實現的方法,str 是被print函式呼叫的,一般都是返回乙個值,這個值是以字串...

python魔法函式

python中魔法函式簡單上來說就是在構建某個類的時候,給類定義一些初始的方法,來實現類物件的某些屬性或者方法而準備。其形式如下,下雙劃線開頭雙劃線結尾 初始化乙個學生class class student def init self,students list self.students list...

python 魔法函式

python中以 開頭,以 結尾的函式就是魔法函式,類中的魔法函式是為了增強類的特性。魔法函式不能自定義。同時魔法函式定義之後不需要呼叫,直譯器會自動進行呼叫。class company object def init self,employee list self.employee employe...