1. 程式人生 > 實用技巧 >Python學習————魔法方法

Python學習————魔法方法

Python中的魔法方法

1._init_:

初始化函式,在建立例項物件為其賦值時使用,在__new__之後,__init__必須至少有一個引數self,
就是這個__new__返回的例項,__init__是在__new__的基礎上可以完成一些其它初始化的動作,
__init__不需要返回值。

2._new_:

__new__ 是用來建構函式,建立並返回一個例項物件,呼叫__new__就會產生一個物件,但需要注意的是:只有繼承自object的新式類才會有__new__方法,並且__new__至少要有一個引數,用來代表例項化的類,這個引數的例項化則是由python直譯器自動提供的,並且__new__必須要有返回值,返回例項化出來的例項,同時也可以return父類__new__出來的例項或者直接object的__new__出來的例項

從執行結果看__new__中的引數cls 和B的id是相同的,表明__new__中預設的引數cls就是B類本身,二在return的時候,並沒有正確的返回當前cls的例項,而是返回了其父類A的例項,因此__init__方法並沒有被呼叫,此時__new__雖然是在寫B類中的,但其建立並返回的是一個A的例項物件

當__new__返回正確的引數

當__new__正確返回其當前類cls的例項物件時,__init__被呼叫到了,此時建立並返回的是一個B類的例項物件

3_class_:

我們可以通過__class__ 來獲得已知物件的類(物件.__class__)
__class__ 可以使用在:
(當一個類中的某個成員變數是所有的該類的物件的公共變數時)

從執行結果看,雖然a和b是兩個不同的A類的例項物件,但採用了__class__之後,
分別呼叫兩個物件的addcount方法後,獲取到的物件的count屬性確實不斷地累加的,此時
self.__class__.count不再是單純的某個物件的私有屬性,而是類的所有例項物件的共有屬性,它相當於self.A.count,若self.__class__.count += 1 變為self.count += 1此時__class__的效果就十分明顯了

4._str_:

將物件轉換成字串 str(物件)測試的時候,列印物件的資訊,__str__方法必須要
return一個字串型別的返回值,作為對例項物件的字串描述,__str__實際上是
被print函式預設呼叫的,當要Print(例項物件)時,預設呼叫__str__方法,將其
字串描述返回。如果不是要用str()函式轉換,當你列印一個類的時候,那麼print
首先呼叫的就是類裡面的定義的__str__

5._repr_:

如果說__str__體現的是一種可讀性,是給使用者看的,那麼__repr__方法體現的則是一種準確,
是給開發人員看的,它對應的是repr()函式,重構__repr__方法後,在控制檯直接敲出例項
物件的名稱,就可以按照__repr__中return的值顯示了。

列印操作會首先嚐試__str__和str聶志函式print執行的內部等價形式,它通常應該返回一個編碼字串,可以用來重新建立物件。

6._del_:

__del__物件在程式執行結束後進行垃圾回收的時候呼叫__del__方法可以來釋放資源,此時
del方法是被自動呼叫的,除非有特殊要求,一般不需要重寫,再關閉資料庫連線物件的時候
可以用來釋放資源

當程式執行結束後__del__被呼叫了三次,分別對三個物件逐次進行了垃圾回收

7._getattribute_:

屬性訪問攔截器,在訪問例項屬性時自動呼叫,子啊python中類的屬性和方法都
理解為屬性,且均可以通過__getattribute__獲取,當獲取屬性時,相當於堆屬性
進行重寫,如果return object.__getattribute(self,*args,**kwargs)或者
根據判斷return所需要的重寫值,如果需要獲取某個方法的返回值時,則需要在函式後面
加上一個()即可,如果不佳的話,返回的是函式引用地址

在建立例項物件s並對其初始化的時候,subject1的值設定為‘python’,subject2的值設定為‘aaa’,在訪問s的subject1屬性時,因為Test類對object類中的__getattribute__方法進行了重寫,所以在呼叫此方法時,首先對要訪問的屬性做一個攔截和判斷,此時__getattribute__方法中的引數obj對應的是要訪問的屬性,若要訪問subject1屬性,則對該屬性進行重寫,返回了一個不同的字串,我們可以看到,在初始化時,subject1 的值為‘python’,而在訪問subject1這個屬性時,返回的值是'redirect python',而在訪問subject2時,則呼叫其父類中的__getattribute__方法,返回正常的subject2屬性的值。當然,在訪問類的方法屬性時,也可以通過重寫__getattribute__的方法對其進行重寫。

8._base_:

獲取指定類的所有父類構成元素,使用方法為類名.__bases__

9._mro_:

顯示指定類的所有繼承脈絡和繼承順序,假如這個指定的類不具有某些方法和屬性,但與其有血統關係的
類中具有這些屬性和方法,則在訪問這個類本身不具有的這些方法和屬性時,會按照__mro__顯示
出來的順序一層一層向後查詢,直到找到為止。

博文參考:https://www.jianshu.com/p/3f4786b33f34