python有眾多的魔法方法,它們會在滿足某種條件下觸發執行,掌握好魔法方法的使用,可以加快程式的執行效率,同時減少邏輯呼叫。
python的一些魔法方法是關鍵字觸發的,即python直譯器遇到某個關鍵字就會去執行相應的魔法方法。
如果乙個物件定義了__del__魔法方法,那麼直譯器會呼叫del關鍵字後物件的__del__魔法方法,然後在上下文中刪除該物件。
class dog(object):
def __init__(self):
pass
def __del__(self):
print('delete the dog object')
dog = dog()
del dog # 等價於 dog.__del__()
注意__del__魔法方法做的工作不是刪除dog物件,而是在刪除dog物件發生之前呼叫,是刪除之前的鉤子。
如果乙個類實現了_enter_、__exit__魔法方法,我們就說這個類實現了乙個上下文管理器,它使用with關鍵字觸發,更多的用法參考:python之上下文管理器
乙個物件定義了__bool__魔法方法後,if關鍵字會觸發該魔法方法,如果沒有定義就會使用直譯器預置的處理演算法。
class list(list):
def __bool__(self):
print('list bool')
return true
if __name__ == "__main__":
ls = list()
if ls: # 為真,等價於bool(ls)
print('mmm')
當使用in或not in關鍵字判斷乙個容器裡的元素時,觸發該容器的_contains_,如果沒有定義,python就會迭代整個序列.
class mylist(list):
def __contains__(self, item):
print('__contains__')
return super().__contains__(item) # 返回true或false
if __name__ == "__main__":
my = mylist([1,2,3])
if 1 in my: # 等價於 bool(my.__contains__(1))
pass
python像大多數程式語言一樣有那麼多的運算子,為什麼哪些運算子有著相應的功能呢?答案就在於運算子會觸發相應的魔法方法。
python的運算子有算術運算子、邏輯運算子、比較運算子等:
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__方法被呼叫了,即py會優先呼叫自定義的物件的__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,呼叫__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__方法
python之with關鍵字
with表示式其實是try finally的簡寫形式。但是又不是全相同。格式with context as var pass 其中的context是乙個表示式,返回的是乙個物件,var用來儲存context表示式返回的物件,可以有單個或者多個返回值。但是with本身並沒有異常捕獲的功能,但是如果發生...
python保留關鍵字和常用關鍵字
python保留關鍵字和常用關鍵字如下 上圖是python3中的關鍵字,python2.7中的關鍵字部分會有區別,具體在自己列印輸出檢視 import keyword print join keyword.kwlist lambda 用於匿名函式中 assert 斷言語句,常用與除錯 raise 用...
python關鍵字和用法 python關鍵字用法
python關鍵字用法 use bin env python coding utf 8 from keyword import kwlist as all keywords from import as print list all keywords print true and 1 1 2 tru...