類別 (class) 用來設計自己需要的物件 (object) ,也就是說類別是物件的藍圖。 Python 中設計類別使用關鍵字 (keyword) class ,裡頭可定義類別的類別屬性 (class attribute) 、實體屬性 (instance attribute) 與方法 (method) 等等
class_object_name
def method_name(self):
self.instance
先舉一例示範如何定義類別
class Demo:
def set_att(self, a, b):
self.a = a
self.b = b
def do_something(self):
return self.a + self.b
d = Demo()
d.set_att(11, 22)
print(d.do_something())
#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:class_demo.py
# 功能:示範 Python 中的類別
# 作者:張凱慶 */
class 後面空一格,然後接類別的識別字,此例為 Demo ,最後接一個冒號
class Demo:
下面用縮排的方式定義兩個方法,方法定義使用函數 (function) 定義相同的關鍵字 def
class Demo:
def set_att(self, a, b):
self.a = a
self.b = b
def do_something(self):
return self.a + self.b
方法其實跟函數很多地方是一樣的,簡單說,方法可以看作是物件專屬的函數,這裡兩個方法 set_att() 與 do_something() 都有一個參數 (parameter) 名為 self
def set_att(self, a, b):
我們用橄欖色標記 self ,主要因為這是個識別字 (identifier) ,代表物件本身自己,當然可以自己取第一個參數的名稱,不過習慣上都用 self 。
標準程式庫 (standard library) 中的識別字同樣用橄欖色標記。
set_att() 有兩個參數 a 與 b ,這兩個參數用來設定實體屬性 self.a 與 self.b
self.a = a
self.b = b
物件又稱為實體 (instance) ,因為這是從類別所創造出來的。由於 self 在方法定義中表示物件本身,因此凡是方法中用 self. 接識別字都是實體屬性,這是物件的屬性值。
下面建立 Demo 物件,然後呼叫 set_att() 與 do_something()
d = Demo()
d.set_att(11, 22)
print(d.do_something())
建立物件類似呼叫函數,指派運算子後面為類別名稱加上小括號,此例執行結果如下
$ python class_demo.py |
33 |
$ |
參數也可以有預設值,這就在參數列 (parameter list) 直接指派數值即可,另舉一例如下
class Demo:
def set_att(self, a=22, b=33):
self.a = a
self.b = b
def do_something(self):
return self.a + self.b
d = Demo()
d.set_att()
print(d.do_something())
#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:class_demo2.py
# 功能:示範 Python 中的類別
# 作者:張凱慶 */
這裡將 set_att() 的兩個參數都設定初值,因此呼叫時沒有給參數,執行結果如下
$ python class_demo2.py |
55 |
$ |
下例示範在類別中設置類別屬性及類別方法 (class method)
class Demo:
a = 11
b = 22
@classmethod
def do_something(cls):
cls.a += 1
cls.b += 1
return cls.a + cls.b
print(Demo.do_something())
#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:class_demo3.py
# 功能:示範 Python 中的類別
# 作者:張凱慶 */
class Demo:
a = 11
b = 22
類別方法則要用裝飾子 (decorator) @classmethod 標示,我們用橘色的語法高亮度標記這個裝飾器
@classmethod
def do_something(cls):
cls.a += 1
cls.b += 1
return cls.a + cls.b
同樣的,類別方法的第一個參數習慣上採 cls ,藉由 cls 可存取類別屬性,此例的 do_something() 除了將類別屬性遞增外,也回傳兩個類別的相加值。
print(Demo.do_something())
執行結果如下
$ python class_demo3.py |
35 |
$ |
Python 的屬性都預設為公開,就是可以在類別以外的地方存取,接下來我們介紹如何限制屬性只能在類別中存取,也就是把屬性封裝 (encapsulate) 在類別中。
中英文術語對照 | |
---|---|
類別屬性 | class attribute |
類別方法 | class method |
裝飾器 | decorator |
封裝 | encapsulate |
函數 | function |
識別字 | identifier |
實體 | instance |
實體屬性 | instance attribute |
關鍵字 | keyword |
方法 | method |
物件 | object |
參數 | parameter |
參數列 | parameter list |
標準模組庫 | standard library |
重點整理 |
---|
1. 類別是物件設計的藍圖,每一個類別都可定義屬性及方法。 |
2. 方法如同函數,專屬於類別。實體屬性屬於由類別建立的物件,類別屬性則屬於類別,須由類別名稱調用。 |
3. self 為預設的的參數名稱,表示物件實體。 |
4. __init__() 是類別定義中特殊的方法,用來建立物件。 |
問題與討論 |
---|
1. 方法跟函數有什麼異同? |
2. 為什麼要有類別屬性?類別屬性跟實體屬性有什麼不同? |
3. 如果不寫 self ,那可以用其他的字代替嗎? |
練習 |
---|
1. 寫一個程式 exercise0901.py ,裡頭設計一個類別 IntegerDemo , 利用 set_value() 方法設定實體屬性 value ,另外定義 add() 方法, add() 需要一個參數 p ,其內容為 value 加上 p ,執行部分先將 value 設定為 25 ,然後再呼叫 add() 並以 24 當參數。 |
2. 承上題,另寫一個程式 exercise0902.py ,改成由使用者輸入兩個整數。 |
3. 承上題,另寫一個程式 exercise0903.py ,加入 subtract() 方法, subtract() 是將 value 減去參數值,最後結果儲存在 value 。 |
4. 承上題,另寫一個程式 exercise0904.py ,繼續擴充 IntegerDemo ,加入乘法的方法。 |
5. 承上題,另寫一個程式 exercise0905.py ,繼續擴充 IntegerDemo ,加入除法的方法。 |
6. 寫一個程式 exercise0906.py ,仿照 IntegerDemo ,將方法改成計算階層值,結果儲存在 value 。 |
7. 寫一個程式 exercise0907.py ,仿照 IntegerDemo ,將方法改成計算費氏數列,結果儲存在 value 。 |
相關教學影片