關鍵字 (keyword) class 用來定義類別 (class) ,類別是規劃物件 (object) 的藍圖,凡是物件的屬性 (attribute) 及方法 (method) 都要在類別中定義。
這邊 Demo 是種簡單的類別,類別內容只用關鍵字 pass 帶過,底下用變數 (variable) d 建立 Demo 型態的實體物件,然後用內建函數 (built-in function) type() 取得變數 d 的型態,可以看到變數 d 是 __main__ 作用域下的 Demo 型態
class Demo:
pass
d = Demo()
print(type(d))
#《程式語言教學誌》的範例程式
# http://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()
#《程式語言教學誌》的範例程式
# http://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()
#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:class03.py
# 功能:示範定義類別
# 作者:張凱慶
於命令列執行以上程式,結果如下
$ python3 class03.py |
Hello Mary ! |
Hello Tom ! |
$ |
self 與 cls 都是識別字,這是說兩者都可改用自訂名稱,也就是方法定義都至少有一個參數,這個參數可以自己取名,習慣上實體方法用 self ,類別方法用 cls 。
在單元 6 中會繼續討論以下各個主題
- 6.1 __init__()
- 6.2 __str__()
- 6.3 __doc__
- 6.4 類別屬性與實體屬性
- 6.5 static 方法與類別方法
- 6.6 封裝
- 6.7 繼承
- 6.8 子類別的方法改寫
- 6.9 多重繼承
- 6.10 多型
- 6.11 __del__()
- 6.12 迭代器
- 6.13 物件模型
相關教學影片