【一】什么是魔法方法
-
在類內部達到指定條件會自動觸發的方法
【二】魔法方法
# 【1】__init__ : 實例化類得到對象的時候會自動觸發 class Student(object):def __init__(self):print(f"實例化類的時候觸發") # 實例化類的時候觸發 ? s = Student() ? # 【2】__del__ : 當對象/對象關閉銷毀的時候自動觸發 # 場景:打開文件 open --> close ?class Student(object):def __init__(self):print(f"實例化類的時候觸發") # 實例化類的時候觸發 ?def __del__(self):print(f"當前在銷毀的時候觸發") # 當前在銷毀的時候觸發 s = Student() ? # 【3】__str__ : 在打印當前對象的時候可以定制打印當前對象的顯示內容 # 必須且只能返回字符串類型的數據def __str__(self):print(f"打印當前對象的時候觸發")return self.name# 【4】__repr__ : 交互解釋器會觸發def __repr__(self):print(f"與解釋器交互的時候會觸發")print('-------')return self.name# 【5】__doc__ : 打印類里面的注釋內容的時候會觸發# 對象.__doc__# 類.__doc____doc__ = "這是一個學生類"# 【6】__enter__ : 打開文檔的時候會觸發 with 語句觸發def __enter__(self):print(f"打開文檔的時候會觸發")print('-------')return self ? # 【7】__exit__ : 關閉文檔的時候會觸發 with 語句觸發def __exit__(self, exc_type, exc_val, exc_tb):print(f"關閉文檔的時候會觸發")print('-------')...# 【8】__getattr__ : 獲取當前對象的不存在的屬性的時候觸發# __getattribute__ : 值不存在的時候會觸發異常def __getattr__(self, item):print(f'當前對象屬性不存在的時候會觸發')print(item) ?# 就是不存在的屬性的變量名# 父類里面有一個 __getattribute__ 能主動拋出值不存在的異常super().__getattribute__(item) # 【9】__setattr__ : 設置對象的屬性值的時候會觸發(包括 __init__ 初始化屬性)def __setattr__(self, key, value):print(f'設置當前對象屬性的時候會觸發 對象.key=value')print(f"key :>>>>> {key}")print(f"value :>>>>> {value}") # 【10】__setattr__ : 刪除對象的屬性值的時候會觸發def __delattr__(self, item):print(f'當前在刪除屬性的時候會觸發')print(item)print('-------')# 【11】__setitem__ : 對象[key]=value 設置值的時候會觸發def __setitem__(self, key, value):print(f'設置屬性的時候會觸發 設置方式為 對象[key]=value')print(key, value)print('-------')# 用自己的名稱空間字典放self.__dict__[key] = value# 【12】__getitem__ : 獲取屬性的時候會觸發 設置方式為 對象[key]def __getitem__(self, item):print(f'獲取屬性的時候會觸發 設置方式為 對象[key]')print('-------')return self.__dict__[item] # 【13】__delitem__ : 刪除屬性的時候會觸發 刪除方式為 del 對象[key]def __delitem__(self, key):print(f'刪除屬性的時候會觸發 刪除方式為 del 對象[key]')print(key)print('-------') ? ? # 【14】__getattribute__: 負責正常對象。屬性不存在的時候的報錯方法def __getattribute__(self,item):# s = Student(name='dream') # print(s) # <__main__.Student object at 0x0000023FE2084E50> # print(repr(s)) # 觸發 __repr__ # print(s.__doc__) # print(Student.__doc__) ? # with Student('hope') as fp: # ? ? print(fp,type(fp)) ? # s = Student(name='dream') # print(s.name) # print(s.age) ? # s.age = 18 # del s.age # print(s.age) ? # s['gender'] = 'male' # print(s['gender']) # # del s['gender'] ? ? ? ? ?
# 【15】 __call__ :觸發條件是當前類()或對象()調用的時候 ? class Student:def __init__(self):print(f'__init__被觸發') ?def __call__(self, *args, **kwargs):print(f"__call__被觸發") ? ? # __call__ 可以放在兩個位置 # 一個位置在當前對象的父類中 直接對象()會觸發當前類的__call__ # 另一個位置在當前對象的父類的元類在會觸發 s = Student() s() ? ? # callable:校驗當前對象是否可被調用() # 類本身可以可以被任意調用的 print(callable(Student)) ? ?# True # 但是對象不可以直接被調用 # 想讓對象也能()調用,就必須重寫__call__ print(callable(s)) ? ? ?# True 如果將上面的__call__刪掉 則s()就無法調用變為False