Python 類的構造方法、析構方法、實例方法
上一個小節(jié)我們學習了 Python 的類屬性和實例屬性的知識點,這個小節(jié)我們還是會學習關于類的知識。這節(jié)課我們會學習類的構造方法、析構方法和實例方法。
1. 實例方法
1.1 定義
實例方法是用于訪問對象實例屬性的方法,語法如下:
class 類:
def 實例方法(self):
self.屬性
實例方法定義在類中,它的第一個參數 self 指向調用該方法的對象,在實例方法中通過 “self.屬性” 訪問對象的實例屬性。
1.2 例子
每個人具有 name 和 age 的屬性,創(chuàng)建一個類 Person,在類 Person 中定義實例方法 introduce 訪問對象的屬性,代碼示例如下:
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 參數指向調用 introduce 方法的對象
- 在第 3 行,introduce 方法通過 self.name 和 self.age 訪問對象的屬性
- 在第 5 行,使用類 Person 創(chuàng)建一個對象 tom
- 在第 6 行,設置對象 tom 的屬性 name,該屬性為實例屬性
- 在第 7 行,設置對象 tom 的屬性 age,該屬性為實例屬性
- 在第 8 行,調用對象 tom 的方法 introduce,對象 tom 被傳遞給方法 introduce,作為 self 參數,在執(zhí)行 introduce 時,self 參數指向對象 tom
- 在第 10 行,使用類 Person 創(chuàng)建一個對象 jerry
- 在第 11 行,設置對象 jerry 的屬性 name,該屬性為實例屬性
- 在第 12 行,設置對象 jerry 的屬性 age,該屬性為實例屬性
- 在第 13 行,調用對象 jerry 的方法 introduce,對象 jerry 被傳遞給方法 introduce,作為 self 參數,在執(zhí)行 introduce 時,self 參數指向對象 jerry
程序運行輸出如下:
name = tom, age = 10
name = jerry, age = 20
2. 構造方法
2.1 為什么需要構造方法
在前面的演示實例方法的程序中,創(chuàng)建了兩個對象 tom 和 age,創(chuàng)建對象后需要設置屬性的初始值,具體的過程如下所示:
- 在第 5 行,使用類 Person 創(chuàng)建一個對象 tom
- 在第 6 行,通過 tom.name = ‘TOM’ 設置對象 tom 的屬性 name
- 在第 7 行,通過 tom.age = 10 設置對象 tom 的屬性 age
- 在第 10 行,使用類 Person 創(chuàng)建一個對象 jerry
- 在第 11 行,通過 jerry.name = ‘TOM’ 設置對象 jerry 的屬性 name
- 在第 12 行,通過 jerry.age = 10 設置對象 jerry 的屬性 age
在初始化對象屬性時,存在一個明顯的問題:初始化 tom 的代碼塊和初始化 jerry 的代碼塊是類似和重復的。Python 提供了一個特殊的方法:構造方法,該方法用于初始化對象屬性,用于解決這個問題。
2.2 定義
構造方法是用于初始化對象屬性的方法,語法如下:
class 類:
def __init__(self, 參數):
self.屬性 = 參數
對象 = 類(參數)
- 在第 2 行,在類中定義了一個方法 __init__,該方法被稱為構造方法
- 方法名的前綴和后綴是兩個下劃線 _
- 方法的第一個參數 self 指向新創(chuàng)建的對象
- 方法的其余參數用于設定對象的屬性
- 在第 3 行,在構造方法中,設定初始化對象的屬性
- 在第 5 行,使用 “對象 = 類(參數)” 的形式創(chuàng)建一個新的對象,新創(chuàng)建的對象作為 self 參數傳遞給類的構造方法 __init__
2.3 例子
每個人具有 name 和 age 的屬性,創(chuàng)建一個類 Person,在類 Person 中定義構造方法 __init__,創(chuàng)建對象時設定對象的屬性,代碼示例如下:
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 的構造方法 __init__
- __init__ 的 self 參數指向新創(chuàng)建的對象
- 在第 3 行和第 4 行,初始化對象的 name 和 age
- 在第 6 行,定義了類 Person 的實例方法 introduce
- introduce 的 self 參數指向調用 introduce 方法的對象
- 在第 7 行,輸出對象的 name 和 age
- 在第 2 行,定義了類 Person 的構造方法 __init__
- 在第 9 行,使用類 Person 創(chuàng)建一個對象 tom
- 新創(chuàng)建對象 tom 時,tom 的屬性 name 和 age 為空
- 將對象 tom 作為參數傳遞給類 Person 的構造方法 __init__
- 在構造方法 __init__** 設置屬性 name 和 age
- 在第 12 行,使用類 Person 創(chuàng)建一個對象 jerry
- 新創(chuàng)建對象 jerry 時,jerry 的屬性 name 和 age 為空
- 將對象 jerry 作為參數傳遞給類 Person 的構造方法 __init__
- 在構造方法 __init__** 設置屬性 name 和 age
程序運行輸出如下:
name = tom, age = 10
name = jerry, age = 20
3. 析構方法
3.1 del 語句
Python 提供了 del 語句用于刪除不再使用的變量,del 語句的語法如下:
del 表達式
使用 del 語句刪除變量,變量刪除后將無法再訪問,代碼如下:
>>> 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 語句刪除變量
- 在第 5 行,打印變量 var 的值
- 在第 6 行,因為變量 var 已經被刪除了,所以無法訪問變量 var,顯示錯誤:name ‘var’ is not defined
3.2 定義
Python 提供了一種機制使得對象被刪除前能夠得到通知。對象被刪除時,如果該對象擁有名為 __del__ 的方法,該方法在刪除前被調用,該方法又被稱為析構方法,語法如下:
class 類:
def __del__(self):
self.屬性
- 在第 2 行,在類中定義了一個方法 __del__,該方法被稱為析構方法
- 方法名的前綴和后綴是兩個下劃線 _
- 方法的參數 self 指向將被刪除的對象
3.3 例子
創(chuàng)建一個類 Person,并定義析構方法 __del__,然后使用類 Person 創(chuàng)建兩個對象,最后再使用 del 語句刪除他們,驗證析構方法,代碼示例如下:
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 行,定義了構造方法 __init__
- 在第 6 行,定義了析構方法 __del__
- 在第 9 行,定義了實例方法 introduce
- 在第 12 行,使用類 Person 創(chuàng)建一個對象 tom
- 在第 13 行,使用類 Person 創(chuàng)建一個對象 jerry
- 在第 18 行,使用 del 語句刪除對象 tom,調用析構方法 tom.__del__()
- 在第 19 行,使用 del 語句刪除對象 jerry,調用析構方法 jerry.__del__()
程序運行輸出如下:
name = tom, age = 10
name = jerry, age = 20
del tom
del jerry
- 在第 1 行,執(zhí)行實例方法 tom.introduce() 輸出該行
- 在第 2 行,執(zhí)行實例方法 jerry.introduce() 輸出該行
- 在第 3 行,執(zhí)行 tom.__del__() 輸出該行
- 在第 4 行,執(zhí)行 jerry.__del__() 輸出該行