python高階 四 魔術方法

2022-05-29 10:00:13 字數 3688 閱讀 3036

魔術方法

在python中,以雙下劃線開頭、雙下劃線結尾的方法我們稱之為魔術方法。例如__init__

魔術方法是python內部定義好的,我們不需要去建立。

1.__new__方法和單例模式

__new__方法:create and return a new object.建立物件時觸發
class

hero(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種屬性值;如果建立過,直接返回已建立的物件;

class

myclass(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):  引數:異常型別、異常值、異常回溯

class

myopen(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())

上下文管理器的應用舉例:

class

testcase(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__方法 :在物件使用括號時被觸發,使類建立的物件像函式一樣可以被引用

class

test(object):

def__call__

(self):

print("

觸發了call方法")

t=test()

t()

#觸發了call方法

4.__str__方法、__repr__方法

__str__方法:print()、str()、format() 觸發

__repr__方法:互動環境》下直接輸入變數時、repr轉換物件時 觸發;當找不到__str__方法,只有__repr__方法時,上述3種均觸發__repr__方法

應用:列印類的一些屬性

class

hero(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): 定義取餘演算法 %

class

mystr(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...