Python 類的構(gòu)造方法、析構(gòu)方法、實(shí)例方法
上一個(gè)小節(jié)我們學(xué)習(xí)了 Python 的類屬性和實(shí)例屬性的知識(shí)點(diǎn),這個(gè)小節(jié)我們還是會(huì)學(xué)習(xí)關(guān)于類的知識(shí)。這節(jié)課我們會(huì)學(xué)習(xí)類的構(gòu)造方法、析構(gòu)方法和實(shí)例方法。
1. 實(shí)例方法
1.1 定義
實(shí)例方法是用于訪問(wèn)對(duì)象實(shí)例屬性的方法,語(yǔ)法如下:
class 類:
def 實(shí)例方法(self):
self.屬性
實(shí)例方法定義在類中,它的第一個(gè)參數(shù) self 指向調(diào)用該方法的對(duì)象,在實(shí)例方法中通過(guò) “self.屬性” 訪問(wèn)對(duì)象的實(shí)例屬性。
1.2 例子
每個(gè)人具有 name 和 age 的屬性,創(chuàng)建一個(gè)類 Person,在類 Person 中定義實(shí)例方法 introduce 訪問(wèn)對(duì)象的屬性,代碼示例如下:
class Person:
def introduce(self):
print('name = %s, age = %d' % (self.name, self.age))
tom = Person()
tom.name = 'tom'
tom.age = 10
tom.introduce()
jerry = Person()
jerry.name = 'jerry'
jerry.age = 20
jerry.introduce()
- 在第 1 行,定義了類 Person
- 在第 2 行,定義了類 Person 的方法 introduce,introduce 的 self 參數(shù)指向調(diào)用 introduce 方法的對(duì)象
- 在第 3 行,introduce 方法通過(guò) self.name 和 self.age 訪問(wèn)對(duì)象的屬性
- 在第 5 行,使用類 Person 創(chuàng)建一個(gè)對(duì)象 tom
- 在第 6 行,設(shè)置對(duì)象 tom 的屬性 name,該屬性為實(shí)例屬性
- 在第 7 行,設(shè)置對(duì)象 tom 的屬性 age,該屬性為實(shí)例屬性
- 在第 8 行,調(diào)用對(duì)象 tom 的方法 introduce,對(duì)象 tom 被傳遞給方法 introduce,作為 self 參數(shù),在執(zhí)行 introduce 時(shí),self 參數(shù)指向?qū)ο?tom
- 在第 10 行,使用類 Person 創(chuàng)建一個(gè)對(duì)象 jerry
- 在第 11 行,設(shè)置對(duì)象 jerry 的屬性 name,該屬性為實(shí)例屬性
- 在第 12 行,設(shè)置對(duì)象 jerry 的屬性 age,該屬性為實(shí)例屬性
- 在第 13 行,調(diào)用對(duì)象 jerry 的方法 introduce,對(duì)象 jerry 被傳遞給方法 introduce,作為 self 參數(shù),在執(zhí)行 introduce 時(shí),self 參數(shù)指向?qū)ο?jerry
程序運(yùn)行輸出如下:
name = tom, age = 10
name = jerry, age = 20
2. 構(gòu)造方法
2.1 為什么需要構(gòu)造方法
在前面的演示實(shí)例方法的程序中,創(chuàng)建了兩個(gè)對(duì)象 tom 和 age,創(chuàng)建對(duì)象后需要設(shè)置屬性的初始值,具體的過(guò)程如下所示:
- 在第 5 行,使用類 Person 創(chuàng)建一個(gè)對(duì)象 tom
- 在第 6 行,通過(guò) tom.name = ‘TOM’ 設(shè)置對(duì)象 tom 的屬性 name
- 在第 7 行,通過(guò) tom.age = 10 設(shè)置對(duì)象 tom 的屬性 age
- 在第 10 行,使用類 Person 創(chuàng)建一個(gè)對(duì)象 jerry
- 在第 11 行,通過(guò) jerry.name = ‘TOM’ 設(shè)置對(duì)象 jerry 的屬性 name
- 在第 12 行,通過(guò) jerry.age = 10 設(shè)置對(duì)象 jerry 的屬性 age
在初始化對(duì)象屬性時(shí),存在一個(gè)明顯的問(wèn)題:初始化 tom 的代碼塊和初始化 jerry 的代碼塊是類似和重復(fù)的。Python 提供了一個(gè)特殊的方法:構(gòu)造方法,該方法用于初始化對(duì)象屬性,用于解決這個(gè)問(wèn)題。
2.2 定義
構(gòu)造方法是用于初始化對(duì)象屬性的方法,語(yǔ)法如下:
class 類:
def __init__(self, 參數(shù)):
self.屬性 = 參數(shù)
對(duì)象 = 類(參數(shù))
- 在第 2 行,在類中定義了一個(gè)方法 __init__,該方法被稱為構(gòu)造方法
- 方法名的前綴和后綴是兩個(gè)下劃線 _
- 方法的第一個(gè)參數(shù) self 指向新創(chuàng)建的對(duì)象
- 方法的其余參數(shù)用于設(shè)定對(duì)象的屬性
- 在第 3 行,在構(gòu)造方法中,設(shè)定初始化對(duì)象的屬性
- 在第 5 行,使用 “對(duì)象 = 類(參數(shù))” 的形式創(chuàng)建一個(gè)新的對(duì)象,新創(chuàng)建的對(duì)象作為 self 參數(shù)傳遞給類的構(gòu)造方法 __init__
2.3 例子
每個(gè)人具有 name 和 age 的屬性,創(chuàng)建一個(gè)類 Person,在類 Person 中定義構(gòu)造方法 __init__,創(chuàng)建對(duì)象時(shí)設(shè)定對(duì)象的屬性,代碼示例如下:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print('name = %s, age = %d' % (self.name, self.age))
tom = Person('tom', 10)
tom.introduce()
jerry = Person('jerry', 20)
jerry.introduce()
- 在第 1 行,定義了類 Person
- 在第 2 行,定義了類 Person 的構(gòu)造方法 __init__
- __init__ 的 self 參數(shù)指向新創(chuàng)建的對(duì)象
- 在第 3 行和第 4 行,初始化對(duì)象的 name 和 age
- 在第 6 行,定義了類 Person 的實(shí)例方法 introduce
- introduce 的 self 參數(shù)指向調(diào)用 introduce 方法的對(duì)象
- 在第 7 行,輸出對(duì)象的 name 和 age
- 在第 2 行,定義了類 Person 的構(gòu)造方法 __init__
- 在第 9 行,使用類 Person 創(chuàng)建一個(gè)對(duì)象 tom
- 新創(chuàng)建對(duì)象 tom 時(shí),tom 的屬性 name 和 age 為空
- 將對(duì)象 tom 作為參數(shù)傳遞給類 Person 的構(gòu)造方法 __init__
- 在構(gòu)造方法 __init__** 設(shè)置屬性 name 和 age
- 在第 12 行,使用類 Person 創(chuàng)建一個(gè)對(duì)象 jerry
- 新創(chuàng)建對(duì)象 jerry 時(shí),jerry 的屬性 name 和 age 為空
- 將對(duì)象 jerry 作為參數(shù)傳遞給類 Person 的構(gòu)造方法 __init__
- 在構(gòu)造方法 __init__** 設(shè)置屬性 name 和 age
程序運(yùn)行輸出如下:
name = tom, age = 10
name = jerry, age = 20
3. 析構(gòu)方法
3.1 del 語(yǔ)句
Python 提供了 del 語(yǔ)句用于刪除不再使用的變量,del 語(yǔ)句的語(yǔ)法如下:
del 表達(dá)式
使用 del 語(yǔ)句刪除變量,變量刪除后將無(wú)法再訪問(wèn),代碼如下:
>>> var = 'hello'
>>> print(var)
hello
>>> del var
>>> print(var)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'var' is not defined
- 在第 1 行,創(chuàng)建變量 var
- 在第 2 行,打印變量 var 的值
- 在第 3 行,正確的輸出了
- 在第 4 行,使用 del 語(yǔ)句刪除變量
- 在第 5 行,打印變量 var 的值
- 在第 6 行,因?yàn)樽兞?var 已經(jīng)被刪除了,所以無(wú)法訪問(wèn)變量 var,顯示錯(cuò)誤:name ‘var’ is not defined
3.2 定義
Python 提供了一種機(jī)制使得對(duì)象被刪除前能夠得到通知。對(duì)象被刪除時(shí),如果該對(duì)象擁有名為 __del__ 的方法,該方法在刪除前被調(diào)用,該方法又被稱為析構(gòu)方法,語(yǔ)法如下:
class 類:
def __del__(self):
self.屬性
- 在第 2 行,在類中定義了一個(gè)方法 __del__,該方法被稱為析構(gòu)方法
- 方法名的前綴和后綴是兩個(gè)下劃線 _
- 方法的參數(shù) self 指向?qū)⒈粍h除的對(duì)象
3.3 例子
創(chuàng)建一個(gè)類 Person,并定義析構(gòu)方法 __del__,然后使用類 Person 創(chuàng)建兩個(gè)對(duì)象,最后再使用 del 語(yǔ)句刪除他們,驗(yàn)證析構(gòu)方法,代碼示例如下:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __del__(self):
print('del %s' % self.name)
def introduce(self):
print('name = %s, age = %d' % (self.name, self.age))
tom = Person('tom', 10)
tom.introduce()
jerry = Person('jerry', 20)
jerry.introduce()
del tom
del jerry
- 在第 1 行,定義了類 Person
- 在第 2 行,定義了構(gòu)造方法 __init__
- 在第 6 行,定義了析構(gòu)方法 __del__
- 在第 9 行,定義了實(shí)例方法 introduce
- 在第 12 行,使用類 Person 創(chuàng)建一個(gè)對(duì)象 tom
- 在第 13 行,使用類 Person 創(chuàng)建一個(gè)對(duì)象 jerry
- 在第 18 行,使用 del 語(yǔ)句刪除對(duì)象 tom,調(diào)用析構(gòu)方法 tom.__del__()
- 在第 19 行,使用 del 語(yǔ)句刪除對(duì)象 jerry,調(diào)用析構(gòu)方法 jerry.__del__()
程序運(yùn)行輸出如下:
name = tom, age = 10
name = jerry, age = 20
del tom
del jerry
- 在第 1 行,執(zhí)行實(shí)例方法 tom.introduce() 輸出該行
- 在第 2 行,執(zhí)行實(shí)例方法 jerry.introduce() 輸出該行
- 在第 3 行,執(zhí)行 tom.__del__() 輸出該行
- 在第 4 行,執(zhí)行 jerry.__del__() 輸出該行