OOP中的常用魔法方法
阿新 • • 發佈:2020-08-19
OOP中的常用魔法方法
前言:魔法方法之所以叫做是魔法方法就是應為它們不需要人為的呼叫,而是在特定時刻會自動觸發,魔法方法的方法名都有一個特點——前後都被雙下劃線包裹,因此又有人稱之為雙下方法
操作類
-
__init__
:建構函式,在類例項化時觸發,好比直接生成了一個打扮時髦的美女 -
__new__
:該函式比較特殊,它在__init__
函式之前觸發,會生成一個空的物件,與__init__
的區別就是它是生成一個沒穿衣服的美女 -
__call__
:在物件加括號呼叫時觸發 -
__str__
:物件被列印時觸發,會講該方法的返回值作為列印結果顯示 -
__del__
:物件回收的時候觸發
屬性操作相關
點攔截方法
__getattr__
:物件.屬性時觸發__setattr__
:物件.屬性賦值時觸發
[]攔截方法
__getitem__
:物件[屬性]時觸發__setitem__
:物件[屬性]賦值時觸發
點攔截方法與[]攔截方法示例
class Person: def __init__(self,name): self.name=name def __setitem__(self, key, value): setattr(self,key,value) #反射 def __getitem__(self, item): return getattr(self,item) # 反射取值 p=Person('daker') p.name='pp' # 重寫__setattr__魔法方法 p['name']=10 # 重寫__setitem__魔法方法 print(p.name) # 重寫__getattr__魔法方法 print(p['name'])# 重寫__getitem__魔法方法 dic={'name':'daker','age':23} class Mydic(dict): def __init__(self, name, age): self.name = name self.age = age def __setattr__(self, key, value): print("物件點屬性賦值,會觸發我") self[key]=value def __getattr__(self, item): print("物件點屬性取值,會觸發我") return self[item] # 不要加引號 mydic=Mydic(**dic) print(mydic['name']) print(mydic.name) mydic.name=99 print(mydic.name)
with上下文管理器
__enter__
和__exit__
示例
class Person: def __enter__(self): print("我在with管理的時候,會觸發") print('進入with語句塊時執行此方法,此方法如果有返回值會賦值給as宣告的變數') return 'oo' def __exit__(self, exc_type, exc_val, exc_tb): print('退出with程式碼塊時執行此方法') print('1', exc_type) print('2', exc_val) print('3', exc_tb) with Person() as p: # 這句話執行,會觸發類的__enter__ print(p)
__eq__
:當物件執行時會觸發,會將後面的物件作為引數傳入
示例
class A:
def __init__(self,x,y):
self.x = x
self.y = y
def __eq__(self,obj):
# 打印出比較的第二個物件的x值
print(obj.x)
if self.x +self.y == obj.x+obj.y:
return True
else:
return False
a=A(1,2)
b=A(99,3)
print(a==b) # 當物件執行==時,會觸發__eq__的執行,並且把b傳進去,就是object
# ==後只要是物件,就可以傳進去,就是object