1. 程式人生 > Python進階應用教學 >03 Python類的構造方法、析構方法、例項方法

03 Python類的構造方法、析構方法、例項方法

上一個小節我們學習了 Python 的類屬性和例項屬性的知識點,這個小節我們還是會學習關於類的知識。這節課我們會學習類的構造方法、析構方法和例項方法。

1. 例項方法

1.1 定義

例項方法是用於訪問物件例項屬性的方法,語法如下:

class:
    def 例項方法(self):
        self.屬性

例項方法定義在類中,它的第一個引數 self 指向呼叫該方法的物件,在例項方法中通過 “self.屬性” 訪問物件的例項屬性。

1.2 例子

每個人具有 name 和 age 的屬性,建立一個類 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 建立一個物件 tom
    • 在第 6 行,設定物件 tom 的屬性 name,該屬性為例項屬性
    • 在第 7 行,設定物件 tom 的屬性 age,該屬性為例項屬性
    • 在第 8 行,呼叫物件 tom 的方法 introduce,物件 tom 被傳遞給方法 introduce,作為 self 引數,在執行 introduce 時,self 引數指向物件 tom
  • 在第 10 行,使用類 Person 建立一個物件 jerry
    • 在第 11 行,設定物件 jerry 的屬性 name,該屬性為例項屬性
    • 在第 12 行,設定物件 jerry 的屬性 age,該屬性為例項屬性
    • 在第 13 行,呼叫物件 jerry 的方法 introduce,物件 jerry 被傳遞給方法 introduce,作為 self 引數,在執行 introduce 時,self 引數指向物件 jerry

程式執行輸出如下:

name = tom, age = 10
name = jerry, age = 20

2. 構造方法

2.1 為什麼需要構造方法

在前面的演示例項方法的程式中,建立了兩個物件 tom 和 age,建立物件後需要設定屬性的初始值,具體的過程如下所示:

  • 在第 5 行,使用類 Person 建立一個物件 tom
    • 在第 6 行,通過 tom.name = ‘TOM’ 設定物件 tom 的屬性 name
    • 在第 7 行,通過 tom.age = 10 設定物件 tom 的屬性 age
  • 在第 10 行,使用類 Person 建立一個物件 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 指向新建立的物件
    • 方法的其餘引數用於設定物件的屬性
  • 在第 3 行,在構造方法中,設定初始化物件的屬性
  • 在第 5 行,使用 “物件 = 類(引數)” 的形式建立一個新的物件,新建立的物件作為 self 引數傳遞給類的構造方法 __init__

2.3 例子

每個人具有 name 和 age 的屬性,建立一個類 Person,在類 Person 中定義構造方法 __init__,建立物件時設定物件的屬性,程式碼示例如下:

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 引數指向新建立的物件
      • 在第 3 行和第 4 行,初始化物件的 name 和 age
    • 在第 6 行,定義了類 Person 的例項方法 introduce
      • introduce 的 self 引數指向呼叫 introduce 方法的物件
      • 在第 7 行,輸出物件的 name 和 age
  • 在第 9 行,使用類 Person 建立一個物件 tom
    • 新建立物件 tom 時,tom 的屬性 name 和 age 為空
    • 將物件 tom 作為引數傳遞給類 Person 的構造方法 __init__
    • 在構造方法 __init__** 設定屬性 name 和 age
  • 在第 12 行,使用類 Person 建立一個物件 jerry
    • 新建立物件 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 行,建立變數 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 例子

建立一個類 Person,並定義析構方法 __del__,然後使用類 Person 建立兩個物件,最後再使用 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 建立一個物件 tom
  • 在第 13 行,使用類 Person 建立一個物件 jerry
  • 在第 18 行,使用 del 語句刪除物件 tom,呼叫析構方法 tom.__del__()
  • 在第 19 行,使用 del 語句刪除物件 jerry,呼叫析構方法 jerry.__del__()

程式執行輸出如下:

name = tom, age = 10
name = jerry, age = 20
del tom
del jerry
  • 在第 1 行,執行例項方法 tom.introduce() 輸出該行
  • 在第 2 行,執行例項方法 jerry.introduce() 輸出該行
  • 在第 3 行,執行 tom.__del__() 輸出該行
  • 在第 4 行,執行 jerry.__del__() 輸出該行