python魔法方法(magic method),顧名思義,魔法總是帶有一些神奇色彩,就跟魔術似的。它也是有自己的規律,在這裡或者說規則更合適一些。
魔法方法有乙個非常鮮明的特徵,就是總是被雙下劃線所包圍,之所以稱之為魔法方法,是由於其不是由程式設計師去手動的呼叫,而是在一定場景下自動觸發,有python直譯器自動呼叫。
①__new__(cls[, …])方法
new 是在物件例項化時觸發,負責為物件分配記憶體空間
它的第乙個引數是這個類,其他的引數是用來直接傳遞給 init 方法
new 決定是否要使用該 init 方法,因為 new 可以呼叫其他類的構造方法或者直接返回別的例項物件來作為本類的例項,如果 new沒有返回例項物件,則 init 不會被呼叫
new 主要是用於繼承乙個不可變的型別比如乙個 tuple 或者 string__init__(self[, …])
構造器,當乙個例項被建立的時候呼叫的初始化方法
class mymethod():
def __new__(cls, *args, **kwargs):
return super().__new__(cls)
# return object.__new__(cls)
②__init__(self,[…])
類的初始化方法。當乙個例項被建立的時候呼叫的初始化方法它獲取任何傳給構造器的引數(比如我們呼叫 m = mymethod(「張三」) ,init就會接到引數
def __init__(self,name):
self.name = name
③__str__(self)
當列印物件的時候回python直譯器回預設呼叫__str__方法,預設不配置,列印物件的位址,當在類中自定義__str__方法時,列印物件就會列印出指定的內容(型別一定要是字串str)
def __str__(self):
return 'name:{}'.format(self.name)
④__repr__(self)
__str__方法的「備胎」,在沒有__str__方法的情況下,用__repr__也可實現列印物件輸出指定內容,當__str__和__repr__同時存在是,預設__str__方法
也可手動列印指定方法的內容:
m = mymethod('張三')
print('%s'%m)
print('%r'%m)
def __repr__(self):
return 'name:{}'.format(self.name)
⑤__call__(self)
將物件當方法來呼叫時,缺省會報錯 物件()或類()()
定義__call__方法可以讓乙個物件當函式來呼叫
def __call__(self, *args, **kwargs):
return self.name
⑥__del__(self)
當乙個例項化物件被銷毀的時候呼叫該物件
手動呼叫del函式時,__del__會被觸發
生命週期結束時,物件被系統**時,__del__會被執行
區域性:方法呼叫結束,觸發__del__方法
全域性:程式結束,觸發 __del__方法
def __del__(self):
print('{}:**前再讓說一下臨終遺言!'.format(self))
⑦__hash__(self)
執行hash()函式時會呼叫該方法
set集合底層資料結構就是採用雜湊表
我們其實可以手動指定底層採用哪些屬性來計算雜湊值,再此不做詳述
⑧__eq__(self)
來用指定用哪些屬性做比較,一般都是引用分類的方法
很少需要手動指定
「==」的本質就是呼叫物件的__eq__方法進行比較
⑨__add__(self)
可以實現物件的相加操作
python 魔法方法 python常用魔法方法
in 1 其實 str 相當於是str 方法 而 repr 相當於repr 方法。str是針對於讓人更好理解的字串格式化,而repr是讓機器更好理解的字串格式化。class test def init self,word self.word word def str self return my n...
Python魔法方法 基本的魔法方法
new cls 1.new 是在乙個物件例項化時候所呼叫的第乙個方法 2.他的第乙個引數是這個類,其他的引數是用來直接傳遞給 init 方法 3.new 決定是否使用該 init 方法,因為.new 可以直接呼叫其他類的構造方法,或者返回別的例項物件來作為本類的例項,如果 new 沒有返回例項物件,...
OOP中的常用魔法方法
前言 魔法方法之所以叫做是魔法方法就是應為它們不需要人為的呼叫,而是在特定時刻會自動觸發,魔法方法的方法名都有乙個特點 前後都被雙下劃線包裹,因此又有人稱之為雙下方法 操作類屬性操作相關 點攔截方法 攔截方法 點攔截方法與攔截方法示例class person def init self,name s...