1. 程式人生 > 實用技巧 >OOP中的常用魔法方法

OOP中的常用魔法方法

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