Python 速查手冊

單元 6 - 類別

關鍵字 (keyword) class 用來定義類別 (class) ,類別是規劃物件 (object) 的藍圖,凡是物件的屬性 (attribute) 及方法 (method) 都要在類別中定義。

這邊 Demo 是種簡單的類別,類別內容只用關鍵字 pass 帶過,底下用變數 (variable) d 建立 Demo 型態的實體物件,然後用內建函數 (built-in function) type() 取得變數 d 的型態,可以看到變數 d__main__ 作用域下的 Demo 型態

class Demo:
    cpass
    
d = Demo()
print(type(d))

#《程式語言教學誌》的範例程式
# https://kaiching.org/
# 檔名:class01.py
# 功能:示範定義類別
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 class01.py
<class '__main__.Demo'>
$

以上變數 d 是用 Demo 類別的建構子 (constructor) 建立的,所謂建構子是用類別名稱加上小括弧,類別有預設的建構子,因此簡單的類別不需要自己定義建構子,利用建構子建立的物件稱為實體 (instance) ,這跟類別本身相對,因為一旦類別定義存在於作用域之後,類別本身就構成了類別物件。

以下簡單看到如何定義實體屬性 (instance attribute) 及實體方法 (instance method) ,前後被兩條底線包圍的 __init__() 方法就是 Demo 類別的建構子,建構子是種特別的方法,方法定義前都要加上關鍵字 def 。第一個參數 (parameter) self 一定要加上,這表示實體自己,所以每個實體方法都要加上 self ,至於 self.name 就是定義實體屬性, name 是屬性名稱,在方法定義內需要用 self 存取,建立實體物件後,就可用實體物件的變數存取, Demo 另外定義了 hello() 方法,同樣可用變數呼叫

class Demo:
    def __init__(self, name):
        self.name = name
    
    def hello(self):
        print("Hello", self.name, "!")
    
d = Demo("Mary")
d.hello()
d.name = "Tom"
d.hello()

《程式語言教學誌》的範例程式
# https://kaiching.org/
# 檔名:class02.py
# 功能:示範定義類別
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 class02.py
Hello Mary !
Hello Tom !
$

下面繼續介紹如何定義類別屬性 (class attribute) 及類別方法 (class method) ,類別屬性直接定義在關鍵字 class 的下方,也就是與 def 具有相同縮排層級的地方,類別方法的上一行寫裝飾子 (decorator) @classmethod ,表示這是個類別方法,其他定義與非類別方法相同,只有第一個參數改成 cls ,至於類別屬性跟類別方法都是跟類別名稱連用,這是因為類別定義本身就是類別物件

class Demo:
    name = "Mary"
    
    @classmethod
    def hello(cls):
        print("Hello", cls.name, "!")
    
Demo.hello()
Demo.name = "Tom"
Demo.hello()

#《程式語言教學誌》的範例程式
# https://kaiching.org/
# 檔名:class03.py
# 功能:示範定義類別
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 class03.py
Hello Mary !
Hello Tom !
$

selfcls 都是識別字,這是說兩者都可改用自訂名稱,也就是方法定義都至少有一個參數,這個參數可以自己取名,習慣上實體方法用 self ,類別方法用 cls

上一頁: 5.3 裝飾子
Python 速查手冊 - 目錄
下一頁: 6.1 __init__()
回 Python 教材首頁