Python--常用魔術方法
阿新 • • 發佈:2022-03-30
魔術方法就是一個類/物件中的方法,和普通方法唯一的不同時,普通方法需要呼叫!而魔術方法是在特定時刻自動觸發。
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