Python學習【魔術方法】

魔術方法

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章