魔法方法
魔法方法
1、何為魔法方法:
Python中,一定要區分開函數和方法的含義;
1.函數:類外部定義的,跟類沒有直接關系的;形式: def func(*argv):
2.方法:class內部定義的函數(對象的方法也可以認為是屬性);分為兩種:
① python自動產生的(魔法方法):一般形式為 __func__(),python會在對應的時機自動調用該函數;
② 人為自定義的方法:一般和普通函數沒有區別,只是定義在了class中而已
3.方法與函數的區別:
方法可認為是函數的特殊情況;
① 方法定義在class內部
② 方法的第一個參數應為 cls(類方法) 或者 self(實例方法)
2、魔法方法匯總:
方法 | 描述 | 備註 |
1、基本方法 | ||
__new__(cls[,*argv]) | 1. __new__ 是在一個對象實例化的時候所調用的第一個方法 2. 它的第一個參數是這個類,其他的參數是用來直接傳遞給 __init__ 方法 3. __new__ 決定是否要使用該 __init__ 方法,因為 __new__ 可以調用其他類的構造方法或者直接返回別的實例對象來作為本類的實例,如果 __new__ 沒有返回實例對象,則 __init__ 不會被調用 4. __new__ 主要是用於繼承一個不可變的類型比如一個 tuple 或者 string |
cls:代表一個類的名稱 self:代表一個實例對象的名稱 |
__init__(self[,*argv]) | 構造器,當一個實例對象被定義時調用 | 類似於C++的構造函數 |
__del__(self) | 析構器,當刪除一個實例對象時調用 | 類似於C++的析構函數 |
__call__(self[,*argv]) | 允許一個類像函數一樣被調用 |
class_x(a,b)實際調用的是class_x.__call__(a,b) |
__len__(self) | 獲得實例對象的長度 |
與調用函數 len(obj)一樣的結果 |
__repr__(self) | 將實例對象轉化為字符串的形式 |
如 ls=[1,2,3], 則repr(ls)為 ‘[1,2,3]‘,與函數repr(obj)功能相同 |
__str__(self) | 將實例對象轉化為字符串的形式 |
與repr()的區別在於:str(obj)的字符串是打印出來讓人看的,更加親民,而repr(obj)是給解釋器看的; 若 a = xxx(列表、字典、元祖或集合等) eval(repr(a)) == a 成立 eval(str(a)) == a 不一定成立 |
__int__(self) | 定義當被 int() 調用時的行為 | |
__float__(self) | 定義當被 float() 調用時的行為 | |
__round__(self[, n]) | 當被round()調用時的行為 | round(digit[, n]) 將digit數字保留n位精度 |
__hash__(self) | 定義能被 hash() 調用的行為 |
|
__bytes__(self) | 定義被 bytes() 調用的行為 | |
__bool__(self) | 定義被 bool() 調用的行為 |
返回True(1) 或 False(0) |
__format__(self, form) |
定義被 format()調用的行為 |
|
2、運算符方法 | ||
__add__(self, other) |
加法:+ |
|
__sub__(self, other) |
減法:- | |
__mul__(self,other) |
乘法:* |
|
__truediv(self, other) | 除法:/ | 註意是 truediv |
__floordiv(self, other) | 整數除法:// | floor()即為向下取整的意思 |
__mod__(self, other) |
求余:% | |
__pow__(self, other[, mod]) | 乘方:** |
pow(x,y[,z]), 若無Z,則為 return x**y 若有Z,則為 return x**y%z |
__divmod__(self, other) | divmode() |
返回值為元祖 (商值,余數) |
__lshift__(self, other) |
左移:<< | |
__rshift__(self, other) | 右移:>> |
|
__and__(self, other) | 按位與:& | 註意以下均為按位操作,非邏輯操作 |
__or__(self, other) | 按位或:| |
|
__xor__(self, other) | 按位異或:^ | |
3、反運算符方法 | ||
__radd__(self, other) |
加法,如a+b,當a不支持__add__()操作時,調用此函數; |
即在運算符的基礎上加上 ‘r‘ 即可,以下雷同 |
__rsub__(self, other) | other - self |
|
………… | ||
4、增量賦值運算符方法 | ||
__iadd__(self, other) |
賦值加法:+= |
即在賦值運算符之前加 ‘i‘ ,以下雷同 |
__isub__(self, other) |
賦值減法:-= |
self = self - other |
………… |
||
5、一元操作符方法 | ||
__pos__(self) | 定義正號:+x | |
__neg__(self) | 定義負號:-x | |
__abs__(self) | 取絕對值 | |
__invert__(self) | 按位求反:~x | |
6、比較操作符方法 | ||
__gt__(self, other) | 大於:> | |
__ge__(self, other) | 大於等於:>= | |
__lt__(self, other) | 小於:< | |
__le__(self, other) | 小於等於:<= | |
__eq__(self, other) | 相等:== | |
__ne__(self, other) | 不等:!= | |
7、屬性操作 | ||
__getattr__(self, name) | 當用戶訪問一個不存在的屬性時調用 | 註意 object/super() (所有類的基類) 是無該方法的 |
__getattribute(self, name) | 訪問存在的屬性時調用 | 先調用此函數,如找不到該屬性,再去調用上面的屬性 |
__setattr__(self, name, value) | 設置屬性時調用 | |
__delattr__(self, name) | 刪除一個屬性時調用 | |
property(fget=None, fset=None, fdel=None, doc=None) | 是一個類,主要功能是為了方便類內部函數的調用 | |
__get__(self, instance, owner) | 描述符被訪問時調用 | 想詳細了解,請點擊這裏 |
__set__(self, instance, value) | 描述符被改變時調用 | |
__delelte__(self, instance, value) |
刪除描述符時調用 | |
8、容器類型操作 | ||
__len__(self) | 求容器的大小(註意與capacity的區別) | 可變和非尅便容器均具備 __len__ 和 __getitem__ |
__getitem__(self, key) | 獲取容器中指定元素的行為 | |
__setitem__(self, key, value) | 設置容器中指定元素的行為 | 只有可變容器擁有 __setitem__ 和 __delitem__ |
__delitem__(self, key) | 刪除容器中指定元素的行為 | |
__iter__(self) | 定義叠代器中元素的行為 | |
__reversed__(self) | 當調用reversed()函數時 | |
__contains__(self, item) | 成員運算符in/ not in的行為 | |
PS: ①.以上所有的魔法方法,君采用__xx__形式(__為雙 "_",雙下劃線) ②.以上魔法方法為Python解釋器自動調用,當然也可以手動調用 ③.魔法方法Python解釋器自動給出默認的,因此除非需要改變其內部功能,其它時刻刻使用默認魔法方法 ④.魔法方法是針對class而言的,脫離了”類“談magic_method是沒有意義的 ⑤.*argv為可變的參數列表,類似C語言的va(variable argument),註意與指針的區別,python中暫時忘掉指針,因為python的內存機制都是解釋器自動完成的 |
魔法方法