python進階之關鍵字和運算子觸發魔法方法
前言
python有眾多的魔法方法,它們會在滿足某種條件下觸發執行,掌握好魔法方法的使用,可以加快程式的執行效率,同時減少邏輯呼叫。
關鍵字與魔法方法
python的一些魔法方法是關鍵字觸發的,即python直譯器遇到某個關鍵字就會去執行相應的魔法方法。
del與__del__
如果一個物件定義了__del__魔法方法,那麼直譯器會呼叫del關鍵字後物件的__del__魔法方法,然後在上下文中刪除該物件。
class Dog(object): def __init__(self): pass def __del__(self): print('delete the dog object') dog = Dog() del dog
with與__enter__、__exit__
如果一個類實現了_enter_ 、__exit__魔法方法,我們就說這個類實現了一個上下文管理器,它使用with關鍵字觸發,更多的用法參考:python之上下文管理器
if與__bool__
一個物件定義了__bool__魔法方法後,if關鍵字會觸發該魔法方法,如果沒有定義就會使用直譯器預置的處理演算法。
class List(list): def __bool__(self): print('list bool') return True if __name__ == "__main__": ls = List([]) if ls: # 為真 print('mmm')
in\not in與__contains__
當使用in或not in關鍵字判斷一個容器裡的元素時,觸發該容器的_contains_ ,如果沒有定義,Python就會迭代整個序列.
class MyList(list): def __contains__(self, item): print('__contains__') return super().__contains__(item) if __name__ == "__main__": my = MyList([1,2,3]) if 1 in my: pass
運算子與魔法方法
python像大多數程式語言一樣有那麼多的運算子,為什麼哪些運算子有著相應的功能呢?答案就在於運算子會觸發相應的魔法方法。
python的運算子有算術運算子、邏輯運算子、比較運算子等:
算術運算子與魔法方法
- +:數值相加,會呼叫相加物件的__add__或__radd__方法。
class Int(int): def __add__(self, other): print('diao yong le add') return super().__add__(other) def __radd__(self, other): print('diao yong le radd') return super().__radd__(other) if __name__ == "__main__": a = Int(3) b = Int(5) c = a + b # 發現__add__方法被呼叫了 c = 3 + a # 方法__radd__方法被呼叫了,只有當操作符左邊的引數沒有定義__add__方法,__radd__方法才會被呼叫。
我們可以通過重寫相關的方法重新定義“+”符號的功能。
同理算術運算子的魔法方法:
a+b:數值相加,會呼叫物件的\__add\__或\__radd__方法。 a-b:數值相減,會呼叫物件的__rsub__或__sub__方法 a*b:數值相乘,呼叫__mul__和__rmul__方法 a/b:數值相除,呼叫__rtruediv__和__truediv__方法 a//b:整除,呼叫__floordiv__和__rfloordiv__方法。 a%b:求餘,呼叫__mod__和__rmod__方法 a**b:求冪,呼叫__pow__和__rpow__方法; -a:求負數,呼叫__neg__方法; +a:呼叫__pos__方法
賦值運算子與魔法方法
a=b: a+=b:a與b相加賦值給a,呼叫__iadd__方法; a-=b:a與b相減賦值給a,呼叫__isub__方法; a*=b:a與b相乘賦值給a,呼叫__imul__方法; a/=b:a與b相除賦值給a,呼叫__itruediv__方法; a%=b:a與求餘賦值給a,呼叫__imod__方法; a//=b:a與b整除賦值給a,呼叫__ifloordiv__方法; a**=b:a與b求冪賦值給a,呼叫__ipow__方法; a&=b:a與b位與運算賦值給a,呼叫__iand__方法; a|=b:a與b位或運算賦值給a,呼叫__ior__方法; a^=b:a與b位異或運算賦值給a,呼叫__ixor__方法;
比較運算子與魔法方法
\>:大於,比較大小返回布林值,呼叫比較引數的\__gt__方法 >=:大於等於,呼叫比較引數的\__ge__方法 <:小於,呼叫比較引數的\__lt__方法 <=:小於等於,呼叫比較引數的\__le__方法 ==:等於,呼叫比較引數的__eq__方法 !=:不等於,呼叫比較引數的__ne__方法
位運算子與魔法方法
位運算子是將數字當做位來運算.
a = 10 # 位 a = 0000 1010 b = 15 # b = 0000 1111 c = a&b # c = 0000 1010 print(c) # 10
相應的魔法方法:
|:或,呼叫比較引數的__or__和__ror__方法 &:與,呼叫比較引數的__and__和__rand__方法 ~:取反,呼叫比較引數的__invert__方法 <<:左移位運算,呼叫比較引數的__lshift__和__rlshift__方法 >>:右移動運算子,呼叫比較引數的__rrshift__和__rshift__方法 ^:異或運算,呼叫比較引數的__rxor__和__xor__方法
參考
- ofollow,noindex" target="_blank">https://docs.python.org/3/