1. 程式人生 > 其它 >Python--常用魔術方法

Python--常用魔術方法

魔術方法就是一個類/物件中的方法,和普通方法唯一的不同時,普通方法需要呼叫!而魔術方法是在特定時刻自動觸發。

 

1.__init__

初始化魔術方法
觸發時機:初始化物件時觸發(不是例項化觸發,但是和例項化在一個操作中)
引數:至少有一個self,接收物件
返回值:無
作用:初始化物件的成員
注意:使用該方式初始化的成員都是直接寫入物件當中,類中無法具有
建立完空間之後呼叫的第一個方法

 

2.__new__

例項化魔術方法
觸發時機: 在例項化對時觸發
引數:至少一個cls 接收當前類
返回值:必須返回一個物件例項
作用:例項化物件
注意:例項化物件是Object類底層實現,其他類繼承了Object的__new__才能夠實現例項化物件。
沒事別碰這個魔術方法,先觸發__new__才會觸發__init__
'

 

 1 # 魔術方法
 2 class Person():
 3     '''
 4     初始化魔術方法
 5     觸發時機:初始化物件時觸發(不是例項化觸發,但是和例項化在一個操作中)
 6     '''
 7 
 8     def __init__(self, name):
 9         print('===init====',self)
10         self.name = name
11 
12     def __new__(cls, *args, **kwargs):  # __new__ 向記憶體空間要地址
13         '''
14
例項化魔術方法 15 觸發時機: 在例項化對時觸發 16 '''
17 print('===new===') 18 position = object.__new__(cls) 19 print(position) 20 return position 21 22 # 由object開闢一個記憶體空間,然後扔給self,然後self在記憶體空間裡放了一個name,又把地址扔給p 23 p = Person('tom') 24 print(p) 25 26 ''' 27 <__main__.Person object at 0x00000232853ED388>
28 ===init==== <__main__.Person object at 0x00000232853ED388> 29 <__main__.Person object at 0x00000232853ED388> 30 '''

 

new__方法的作用是申請記憶體開闢空間
流程是:
1、Person()進行到__new__進行申請空間,position就是新空間,然後返回給__init__
2、__init__接收到__new__返回的新空間positon,進行初始化。
3、p =Person()接受到__init__執行完畢的地址,p =position。

 

3.__call__

呼叫物件的魔術方法 
觸發時機:將物件當作函式呼叫時觸發
物件()
引數:至少一個self接收物件,其餘根據呼叫時引數決定
返回值:根據情況而定
作用:可以將複雜的步驟進行合併操作,減少呼叫的步驟,方便使用
注意:無
 1 # 魔術方法
 2 class Person():
 3     '''
 4     初始化魔術方法
 5     觸發時機:初始化物件時觸發(不是例項化觸發,但是和例項化在一個操作中)
 6     '''
 7 
 8     def __init__(self, name):
 9         print('---------->init', self)
10         self.name = name
11 
12     def __new__(cls, *args, **kwargs):  # __new__ 向記憶體空間要地址
13         '''
14         例項化魔術方法
15         觸發時機: 在例項化對時觸發
16         '''
17         position = object.__new__(cls)  # 由object開闢一個記憶體空間,然後扔給self,然後self在記憶體空間裡放了一個name,又把地址扔給p
18         print('------------>new', position)
19         return position
20 
21     def __call__(self, name):
22         print('--------->call')
23         print('執行物件得到引數是:',name)
24 
25 p = Person('tom')
26 print('---------->p', p)
27 print(p.name)
28 # 將物件當成函式去使用
29 p('jack') # 預設執行__call__
30 '''
31 ------------>new <__main__.Person object at 0x00000221A4200348>
32 ---------->init <__main__.Person object at 0x00000221A4200348>
33 ---------->p <__main__.Person object at 0x00000221A4200348>
34 tom
35 --------->call
36 執行物件得到引數是: jack
37 '''

 

4.__del__

析構魔術方法
觸發時機:當物件沒有用(沒有任何變數引用)的時候被觸發
返回值:無
作用:使用完物件是回收資源
注意:del不一定會觸發當前方法,只有當前物件沒有任何變數接收時才會觸發
1.物件賦值:p = Person()
         p1 = p
         說明:p和p1共同指向同一塊地址
 2.刪除地址引用:
        del p1 刪除p1對地址的引用
 3.檢視對地址的引用次數:
        import sys
        sys.getrefcount() 自己也會引用一次括號這個物件
 4.當一塊空間沒有了任何引用,預設執行__del__
 1 import sys
 2 
 3 
 4 class Person:
 5     def __init__(self, name):
 6         self.name = name
 7 
 8     def __del__(self):
 9         print('----------->del')
10 
11 
12 p = Person('jack')
13 p1 = p
14 p2 = p
15 print(p1.name)
16 print(p2.name)
17 
18 p1.name = 'tom'
19 
20 print(p.name)
21 print(p1.name)
22 
23 print(sys.getrefcount(p))
24 
25 del p2  # 斷掉了p2的引用
26 print('刪除p2後列印', p.name)
27 
28 print(sys.getrefcount(p))
29 
30 del p1  # 斷掉了p1的引用
31 print('刪除p1後列印', p.name)
32 print(sys.getrefcount(p))  # 獲取這個物件的引用個數(這個函式自身會引用一次)
33 
34 del p
35 
36 n = 3
37 print(n)
38 
39 '''
40 jack
41 jack
42 tom
43 tom
44 4
45 刪除p2後列印 tom
46 3
47 刪除p1後列印 tom
48 2
49 3
50 ----------->del
51 '''

 

5.__str__

觸發時機:使用print(物件)或者str(物件)列印物件名的時候
引數:一個self接收物件
返回值:必須是字串型別
作用:print(物件時)進行操作,得到字串,通常用於快捷操作
注意:一定要在__str__方法中新增return,return後面的內容就是列印的內容
 1 class Person:
 2     def __init__(self, name, age):
 3         self.name = name
 4         self.age = age
 5 
 6     def __str__(self):
 7         return '姓名是:' + self.name + ',年齡:' + str(self.age)
 8 
 9 
10 p = Person('tom', 18)
11 print(p)
12 # 沒有使用__str__:
13 # >> <__main__.Person object at 0x000002AD7110CE48>
14 
15 # 使用__str__:
16 # >> 姓名是:tom,年齡:18