Python 常用魔術(shù)方法指南

什么是魔術(shù)方法?
在 Python 中,所有以雙下劃線__包起來的方法,統(tǒng)稱為?Magic Method(魔術(shù)方法)
它是一種的特殊方法,普通方法需要調(diào)用,而魔術(shù)方法不需要調(diào)用就可以自動(dòng)執(zhí)行
魔術(shù)方法在類或?qū)ο蟮哪承┦录霭l(fā)后會(huì)自動(dòng)執(zhí)行,讓類具有神奇的“魔力”,如果希望根據(jù)自己的程序定制自己特殊功能的類,那么就需要對這些方法進(jìn)行重寫?
Python 中常用的運(yùn)算符、for 循環(huán)、以及類操作等都是運(yùn)行在魔術(shù)方法之上的
魔術(shù)方法__init__、__new__、__del__的應(yīng)用
class?People(object):
????#?創(chuàng)建對象
????def?__new__(cls,?*args,?**kwargs):
????????print("觸發(fā)了構(gòu)造方法")
????????ret?=?super().__new__(cls)?#?調(diào)用父類的__new__()方法創(chuàng)建對象
????????return?ret?##?將對象返回
????#?實(shí)例化對象
????def?__init__(self,?name,?age):
????????self.name?=?name
????????self.age?=?age
????????print("初始化方法")
????#??刪除對象
????#???del?對象名或者程序執(zhí)行結(jié)束之后
????def?__del__(self):
????????print("析構(gòu)方法,刪除對象")
if?__name__?==?'__main__':
????p1?=?People('xiaoming',?16)
????
輸出:
觸發(fā)了構(gòu)造方法
初始化方法
析構(gòu)方法,刪除對象
使用__call__方法實(shí)現(xiàn)斐波那契數(shù)列
#?斐波那契數(shù)列指的是這樣一個(gè)數(shù)列?0,?1,?1,?2,?3,?5,?8,?13
#?特別指出:第0項(xiàng)是0,第1項(xiàng)是第一個(gè)1。從第三項(xiàng)開始,每一項(xiàng)都等于前兩項(xiàng)之和。
class?Fib(object):
????def?__init__(self):
????????pass
????def?__call__(self,num):
????????a,b?=?0,1;
????????self.l=[]
????????for?i?in?range?(num):
????????????self.l.append(a)
????????????a,b=?b,a+b
????????return?self.l
????def?__str__(self):
????????return?str(self.l)
????__rept__=__str__
f?=?Fib()
print(f(10))
輸出:
[0,?1,?1,?2,?3,?5,?8,?13,?21,?34]
常用的魔術(shù)方法
1.初始化方法__init__
觸發(fā)機(jī)制:實(shí)例化對象之后立即觸發(fā)
參數(shù):至少有一個(gè)self,接收當(dāng)前對象,其他參數(shù)根據(jù)需要進(jìn)行定義
返回值:無
作用:初始化對象的成員
2.構(gòu)造方法__new__
觸發(fā)時(shí)機(jī):?實(shí)例化對象時(shí)自動(dòng)觸發(fā)(在__init__之前觸發(fā))
參數(shù):至少一個(gè)cls 接收當(dāng)前類,其他參數(shù)根據(jù)初始化方法參數(shù)決定
返回值:必須返回一個(gè)對象實(shí)例,沒有返回值,則實(shí)例化對象的結(jié)果為None
作用:實(shí)例化對象
注意:實(shí)例化對象是Object類底層實(shí)現(xiàn),其他類繼承了Object的__new__才能夠?qū)崿F(xiàn)實(shí)例化對象。
3.析構(gòu)方法__del__
觸發(fā)時(shí)機(jī):當(dāng)該類對象被銷毀時(shí),自動(dòng)觸發(fā)
參數(shù):一個(gè)self,接受當(dāng)前對象
返回值:無
作用:關(guān)閉或釋放對象創(chuàng)建時(shí)資源
注意:del不一定會(huì)觸發(fā)當(dāng)前方法,只有當(dāng)前對象沒有任何變量引用時(shí)才會(huì)觸發(fā)
4.__call__
調(diào)用對象的魔術(shù)方法
觸發(fā)時(shí)機(jī):將對象當(dāng)作函數(shù)調(diào)用時(shí)觸發(fā),方式:?對象()
參數(shù):至少一個(gè)self接收對象,其余根據(jù)調(diào)用時(shí)參數(shù)決定
返回值:根據(jù)情況而定
作用:可以將復(fù)雜的步驟進(jìn)行合并操作,減少調(diào)用的步驟,方便使用
注意:無
5.__len__
觸發(fā)時(shí)機(jī):使用len(對象)?的時(shí)候觸發(fā)
參數(shù):一個(gè)參數(shù)self
返回值:必須是一個(gè)整型
作用:可以設(shè)置為檢測對象成員個(gè)數(shù),但是也可以進(jìn)行其他任意操作
注意:返回值必須必須是整數(shù),否則語法報(bào)錯(cuò),另外該要求是格式要求。
6.__str__
觸發(fā)時(shí)機(jī):使用print(對象)或者str(對象)的時(shí)候觸發(fā)
參數(shù):一個(gè)self接收對象
返回值:必須是字符串類型
作用:print(對象時(shí))進(jìn)行操作,得到字符串,通常用于快捷操作
注意:無
7.__repr__
觸發(fā)時(shí)機(jī):在使用repr(對象)的時(shí)候觸發(fā)
參數(shù):一個(gè)self接收對象
返回值:必須是字符串
作用:將對象轉(zhuǎn)使用repr化為字符串時(shí)使用,也可以用于快捷操作
8.__bool__
觸發(fā)時(shí)機(jī):?使用bool(對象)的時(shí)候觸發(fā)
參數(shù):一個(gè)self接收對象
返回值:必須是布爾值
作用:根據(jù)實(shí)際情況決定,可以作為快捷方式使用
注意:僅適合于返回布爾值的操作
9.__format__
觸發(fā)時(shí)機(jī):使用字符串.format(對象)時(shí)候觸發(fā)
參數(shù):一個(gè)self接收對象,一個(gè)參數(shù)接收format的{}中的格式,例如:>5
返回值:必須是字符串
作用:設(shè)置對象可以作為format的參數(shù),并且自定義對象格式化的規(guī)則
注意:無比較運(yùn)算相關(guān)魔術(shù)方法
__ lt__(self, other):
定義小于號的行為:x < y 調(diào)用 x.lt(y)
__ le__(self, other):
定義小于等于號的行為:x <= y 調(diào)用 x.le(y)
__ eq__(self, other)?:
定義等于號的行為:x == y 調(diào)用 x.eq(y)
__ ne__(self, other):
定義不等號的行為:x != y 調(diào)用 x.ne(y)
__ gt__(self, other):
定義大于號的行為:x > y 調(diào)用 x.**gt(y)
__ ge__(self, other)?:
定義大于等于號的行為:x >= y 調(diào)用 x.ge(y)
算術(shù)運(yùn)算相關(guān)魔術(shù)方法
__add__(self, other)???????????定義加法的行為:+
__sub__(self, other)???????????定義減法的行為:-
__mul__(self, other)???????????定義乘法的行為:*
__truediv__(self, other)???????定義真除法的行為:/
__floordiv__(self, other)??????定義整數(shù)除法的行為://
__mod__(self, other)???????????定義取模算法的行為:%
__divmod__(self,?other)????????定義當(dāng)被?divmod()?調(diào)用時(shí)的行為
__pow__(self,?other[,?modulo])?定義當(dāng)被?power()?調(diào)用或?**?運(yùn)算時(shí)的行為
__lshift__(self, other)????????定義按位左移位的行為:<<
__rshift__(self, other)????????定義按位右移位的行為:>>
__and__(self, other)???????????定義按位與操作的行為:&
__xor__(self, other)???????????定義按位異或操作的行為:^
__or__(self, other)????????????定義按位或操作的行為:|
賦值運(yùn)算相關(guān)魔術(shù)方法
__iadd__(self, other)?????????????定義賦值加法的行為:+=
__isub__(self, other)?????????????定義賦值減法的行為:-=
__imul__(self, other)?????????????定義賦值乘法的行為:=
__itruediv__(self, other)?????????定義賦值真除法的行為:/=
__ifloordiv__(self, other)????????定義賦值整數(shù)除法的行為://=
__imod__(self, other)?????????????定義賦值取模算法的行為:%=
__ipow__(self, other[, modulo])???定義賦值冪運(yùn)算的行為:**=
__ilshift__(self, other)??????????定義賦值按位左移位的行為:<<=
__irshift__(self, other)??????????定義賦值按位右移位的行為:>>=
__iand__(self, other)?????????????定義賦值按位與操作的行為:&=
__ixor__(self, other)?????????????定義賦值按位異或操作的行為:^=
__ior__(self, other)??????????????定義賦值按位或操作的行為:|=
一元運(yùn)算相關(guān)魔術(shù)方法
__pos__(self)??????定義正號的行為:+x
__neg__(self)??????定義負(fù)號的行為:-x
__abs__(self)??????定義當(dāng)被?abs()?調(diào)用時(shí)的行為
__invert__(self)???定義按位求反的行為:~x
類型轉(zhuǎn)換相關(guān)魔術(shù)方法
__complex__(self)??????定義當(dāng)被?complex()?調(diào)用時(shí)的行為(需要返回恰當(dāng)?shù)闹担?br>__int__(self)??????????定義當(dāng)被?int()?調(diào)用時(shí)的行為(需要返回恰當(dāng)?shù)闹担?br>__float__(self)????????定義當(dāng)被?float()?調(diào)用時(shí)的行為(需要返回恰當(dāng)?shù)闹担?br>__round__(self[,?n])???定義當(dāng)被?round()?調(diào)用時(shí)的行為(需要返回恰當(dāng)?shù)闹担?br>__index(self)__????????1.?當(dāng)對象是被應(yīng)用在切片表達(dá)式中時(shí),實(shí)現(xiàn)整形強(qiáng)制轉(zhuǎn)換
???????????????????????2.?如果你定義了一個(gè)可能在切片時(shí)用到的定制的數(shù)值型,你應(yīng)該定義?index
???????????????????????3.?如果?index?被定義,則?int?也需要被定義,且返回相同的值
上下文管理相關(guān)魔術(shù)方法(with)
__enter__ 和 __exit__
__enter__(self)
????1.?定義當(dāng)使用?with?語句時(shí)的初始化行為
????2.?enter?的返回值被?with?語句的目標(biāo)或者?as?后的名字綁定
__exit__(self,?exctype,?excvalue,?traceback)
????1.?定義當(dāng)一個(gè)代碼塊被執(zhí)行或者終止后上下文管理器應(yīng)該做什么
????2.?一般被用來處理異常,清除工作或者做一些代碼塊執(zhí)行完畢之后的日常工作
容器類型相關(guān)魔術(shù)方法
__len__(self)??????????????????定義當(dāng)被?len()?調(diào)用時(shí)的行為(返回容器中元素的個(gè)數(shù))
__getitem__(self,?key)?????????定義獲取容器中指定元素的行為,相當(dāng)于?self[key]
__setitem__(self,?key,?value)??定義設(shè)置容器中指定元素的行為,相當(dāng)于?self[key]?=?value
__delitem__(self,?key)?????????定義刪除容器中指定元素的行為,相當(dāng)于?del?self[key]
__iter__(self)?????????????????定義當(dāng)?shù)萜髦械脑氐男袨?br>__reversed__(self)?????????????定義當(dāng)被?reversed()?調(diào)用時(shí)的行為
__contains__(self,?item)???????定義當(dāng)使用成員測試運(yùn)算符(in?或?not?in)時(shí)的行為評論
圖片
表情
