python高階之關鍵字和運算子觸發魔法方法

2022-07-04 23:18:09 字數 3184 閱讀 3739

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...