魔術方法
在python中,以雙下劃線開頭、雙下劃線結尾的方法我們稱之為魔術方法。例如__init__
魔術方法是python內部定義好的,我們不需要去建立。
1.__new__方法和單例模式
__new__方法:create and return a new object.建立物件時觸發
classhero(object):
def__init__
(self,name): # 對物件進行初始化
print("
這是init方法")
self.name=name
def__new__(cls,*args,**kwargs): # 建立物件
print("
這是new方法")
return super().__new__(cls) #
必須返回原方法 建立物件的功能。如果缺少改行,h1返回值為none
h1=hero("
musen")
print(h1.name)
應用:1. 重寫new方法,返回其他的類物件;
2.單例模式: 通常類每次例項化都會建立乙個物件,通過單例模式可以實現限制 乙個類只建立乙個物件共用;
單例模式實現思路:
1.建立乙個類屬性記錄是否建立過物件;
2.在__new__方法中對類屬性做出判斷:如果沒有建立,就新建乙個物件並修改1種屬性值;如果建立過,直接返回已建立的物件;
classmyclass(object):
'''單例模式類
'''instance=none
def__new__(cls,*args,**kwargs): #
建立物件
ifnot
cls.instance:
cls.instance=object.__new__
(cls)
return
cls.instance
else
:
return
cls.instance
h1=myclass()
h2=myclass()
h3=myclass()
print(id(h1),id(h2),id(h3))
2.上下文管理器
通過with實現,底層使用兩個魔術方法:object.__enter__()、object.__exit__()。乙個類中只要使用了這兩個方法,那麼該類就實現了上下文協議,就是乙個上下文管理器;
object.__enter__(self): 輸入此物件執行時使用的相關上下文;
object.__exit__(self,exc_type,exc_val,exc_tb): 引數:異常型別、異常值、異常回溯
classmyopen(object):
def__init__
(self,filename,mode,encoding):
self.filename=filename
self.mode=mode
self.encoding=encoding
self.f=open(self.filename,self.mode,encoding=self.encoding)
def__enter__
(self):
return self.f #
返回開啟的檔案
def__exit__
(self,exc_type,exc_val,exc_tb):
self.f.close()
#關閉檔案
print(exc_type,exc_val,exc_tb) #當執行出錯時,列印出錯誤資訊
with myopen("1.txt
","r
",encoding="
utf8
") as f:
print(f.read())
上下文管理器的應用舉例:
classtestcase(myopen,unittest.testcase):
def__init__(self,*args,**kwargs):
myopen.
__init__(self,*args,**kwargs)
self,*args,**kwargs.__init__(self,*args,**kwargs)
print("
__init__")
t=testcase()
3.__call__方法 :在物件使用括號時被觸發,使類建立的物件像函式一樣可以被引用
classtest(object):
def__call__
(self):
print("
觸發了call方法")
t=test()
t()
#觸發了call方法
4.__str__方法、__repr__方法
__str__方法:print()、str()、format() 觸發
__repr__方法:互動環境》下直接輸入變數時、repr轉換物件時 觸發;當找不到__str__方法,只有__repr__方法時,上述3種均觸發__repr__方法
應用:列印類的一些屬性
classhero(object):
def__init__
(self,name):
self.name=name
def__str__
(self):
return
self.name
h=hero('
musen')
print(h)
5. 算術運算的實現
__add__(slef,other): 相加 +,以+觸發
__sub__(slef,other): 相減 -
__mul__(slef,other): 相乘 *
__truediv__(slef,other): 定義真除法 /
__floordiv__(slef,other): 定義整數除法 //
__mod__(slef,other): 定義取餘演算法 %
classmystr(object):
def__init__
(self,value):
self.value=value
def__str__
(self):
return
self.value
def__add__(self,other): #
self代表例項本身,other代表其他
return mystr(f'
')def __sub__(self,other):
return self.value.replace(other.value,'')
s1=mystr("
aaa"
)s2=mystr("
bbb"
)print(s1+s2)
python高階之魔術方法詳解
目錄 1 classmethod 類名.屬性名 2 staticmethod 類名.屬性名 3 property 設定唯讀屬性,方法變屬性,別人不易篡改,呼叫 類名 屬性名 1 乙個類物件,在 init 初始化之前,還有 new 方法,這裡要重寫 new 方法,要呼叫父類的new方法程式設計客棧,且...
python 魔術方法
魔術方法 呼叫方式 解釋 new cls instance myclass arg1,arg2 new 在建立例項的時候被呼叫 init self instance myclass arg1,arg2 init 在建立例項的時候被呼叫 cmp self,other self other,self o...
Python魔術方法
參考文章 python 魔術方法指南 魔術方法,顧名思義是一種可以給物件 類 增加魔法的特殊方法,它們的表示方法一般是用雙下劃線包圍 如 init from os.path import join class fileobject 給檔案物件進行包裝從而確認在刪除時檔案流關閉 def init se...