魔術方法
Python中,所有以雙下劃線“__”包圍的方法(即定義在類中的函數)爲魔術方法Magic Method。
構造和初始化
在使用classname()創造實例化對象時,會依次執行__new__和__init__兩個方法。
__new__是用來創建類並返回這個類的實例(一般)
__init__只是將傳入的參數來初始化該實例,稱爲**構造方法**
__del__在釋放對象時調用,稱爲**析構方法**
控制訪問
__getattr__(self,item):訪問不存在屬性時調用的方法。(item爲屬性名)
__getattribute__(self,item):訪問屬性就會調用(無論item屬性是否存在)。
object類中在getattribute方法中調用gettattr方法。
__setattr__(self, key, value):使用'='對屬性(不存在則創建)進行賦值時調用的方法。
每次利用‘=’爲對象的屬性賦值時都會調用__setattr__方法。
所以該方法中不能出現self.key=value類似直接對對象屬性進行賦值的語句,否則會產生無限遞歸。
如果要實現self.key=value的邏輯
可以採用self.__dict__[key]=value的方式,避免直接對屬性賦值產生遞歸。
__delattr__:在刪除屬性時調用的方法。
自定義容器
Python內置的魔術方法,可以使得用戶自定義的類具有與常見容器數據類型類似的行爲特性。
常見容器數據類型包括(列表/元組/集合/字典/字符串等)
__len__(self):返回容器的長度。
__getitem__(self, key):利用索引訪問容器內元素時調用的方法。(即self[key])
__setitem__(self, key, value):利用索引賦值時調用的方法。(即self[key]=value)
__delitem__(self, key):利用索引刪除容器內元素時調用的方法。(即del self[key])
__iter__(self):返回一個迭代器,內置iter()進行調用或使用for循環遍歷時調用,必須定義返回self的__iter__方法。
__reversed__(self):當調用reversed()時調用的方法,應返回有序序列的倒序。
__contains__(self, item):進行in 或not in時調用的方法,如果不定義會迭代容器中的元素來判斷返回True或者False。
__missing__(self, key):key在容器中找不到時調用。(字典類型中含有該方法)
可調用對象
__call__(self, *args, **kwargs):當對象被作爲函數進行調用時調用的方法。
上下文管理
with聲明引入新的代碼塊
__enter__(self):with引入代碼塊開始時調用的方法。
返回值與with語句的目標或者as後的名字綁定
__exit__(self, exc_type, exc_val, exc_tb):代碼塊結束或被終止時調用的方法。
當代碼塊執行正常, exc_type, exc_val, exc_tb均爲None。
深淺拷貝
__copy__(self):當對實例化對象進行copy.copy()時調用的方法。
淺拷貝是相當於引用原對象的數據,對淺拷貝對象數據的修改,會影響到原來的數據。
__deepcopy__(self, memodict={}):當對實例化對象進行copy.deepcopy()時調用的方法。
深拷貝是將對象及其數據全拷貝一份,對深拷貝對象數據的修改,不會影響原數據。
其他常見方法
用於比較的魔術方法
__cmp__(self, other) 是比較方法裏面最基本的的魔法方法
__eq__(self, other) 定義相等符號的行爲,==
__ne__(self,other) 定義不等符號的行爲,!=
__lt__(self,other) 定義小於符號的行爲,<
__gt__(self,other) 定義大於符號的行爲,>
__le__(self,other) 定義小於等於符號的行爲,<=
__ge__(self,other) 定義大於等於符號的行爲,>=
數值計算的魔術方法
單目運算符和函數
__pos__(self) 實現一個取正數的操作
__neg__(self) 實現一個取負數的操作
__abs__(self) 實現一個內建的abs()函數的行爲
__invert__(self) 實現一個取反操作符(~操作符)的行爲
__round__(self, n) 實現一個內建的round()函數的行爲
__floor__(self) 實現math.floor()的函數行爲
__ceil__(self) 實現math.ceil()的函數行爲
__trunc__(self) 實現math.trunc()的函數行爲
雙目運算符或函數
__add__(self, other) 實現一個加法
__sub__(self, other) 實現一個減法
__mul__(self, other) 實現一個乘法
__floordiv__(self, other) 實現一個“//”操作符產生的整除操作()
__div__(self, other) 實現一個“/”操作符代表的除法操作
__truediv__(self, other) 實現真實除法
__mod__(self, other) 實現一個“%”操作符代表的取模操作
__divmod__(self, other) 實現一個內建函數divmod()
__pow__ 實現一個指數操作(“**”操作符)的行爲
__lshift__(self, other) 實現一個位左移操作(<<)的功能
__rshift__(self, other) 實現一個位右移操作(>>)的功能
__and__(self, other) 實現一個按位進行與操作(&)的行爲
__or__(self, other) 實現一個按位進行或操作的行爲
__xor__(self, other) __xor__(self, other)
增量運算
__iadd__(self, other) 加法賦值
__isub__(self, other) 減法賦值
__imul__(self, other) 乘法賦值
__ifloordiv__(self, other) 整除賦值,地板除,相當於 //= 運算符
__idiv__(self, other) 除法賦值,相當於 /= 運算符
__itruediv__(self, other) 真除賦值
__imod_(self, other) 模賦值,相當於 %= 運算符
__ipow__ 乘方賦值,相當於 **= 運算符
__ilshift__(self, other) 左移賦值,相當於 <<= 運算符
__irshift__(self, other) 左移賦值,相當於 >>= 運算符
__iand__(self, other) 與賦值,相當於 &= 運算符
__ior__(self, other) 或賦值
__ixor__(self, other) 異或運算符,相當於 ^= 運算符
類型轉換
__int__(self) 轉換成整型
__long__(self) 轉換成長整型
__float__(self) 轉換成浮點型
__complex__(self) 轉換成 複數型
__oct__(self) 轉換成八進制
__hex__(self) 轉換成十六進制
__index__(self) 如果你定義了一個可能被用來做切片操作的數值型,你就應該定義__index__
__trunc__(self) 當 math.trunc(self) 使用時被調用__trunc__返回自身類型的整型截取
__coerce__(self, other) 執行混合類型的運算
參考博客:
https://www.cnblogs.com/pyxiaomangshe/p/7927540.html
https://blog.csdn.net/may_xu_/article/details/81513170