SlideShare a Scribd company logo
5. 從模組到類別
5. 從模組到類別
• 學習目標
– 深入模組管理
– 初識物件導向
– 學習定義類別
– 定義運算子
2
架構程式
• 抽象層的封裝與隔離
• 物件的狀態
• 名稱空間
• 資源實體組織方式
3
用模組建立抽象層
• 一個 .py 檔案就是一個模組
• 模組成為 Python 中最自然的抽象層
4
• 想要知道一個模組中有哪些名稱,可以使
用 dir() 函式
5
• import 某個模組,指定的 .py 檔案載入
• python 直譯器會為它建立一個 module
實例,並建立一個模組名稱來參考它
6
• 銀行商務相關的簡單程式
7
• 透過 bank 模組名稱來進行相關的商務流程
8
• from import 會將被匯入模組中之名稱參
考的值,指定給目前模組中建立的新名稱
9
• 如果有些變數,並不想被 from import
* 建立同名變數,可以用底線作為開頭
• 例如,若 foo.py 中有以下內容:
10
• 定義 __all__ 清單,使用字串列出可被
from import * 的名稱:
11
• 若模組定義了__all__ 變數,名單中的變
數,才可以被其他模組 from import *
12
• 無論是底線開頭,或者是未被列入
__all__ 清單的名稱,只是限制不被
from import *
• 若使用者 import foo,依舊可以使用
foo._y 或 foo.z 來存取
13
• 可以使用 del 將模組名稱或者 from
import 的名稱刪除
14
• 模擬 import foo as qoo
15
• del 是用來刪除指定的名稱,而不是刪除
名稱參考的物件本身
16
• 想要知道目前已載入的 module 名稱與實
例有哪些,可以透過 sys.modules
17
• 能根據不同的情況進行不同的 import
18
設定 PTH 檔案
• 尋找模組時的來源
– 執行 python 直譯器時的資料夾
– PYTHONPATH 環境變數
– Python 安裝中標準程式庫等資料夾
– PTH 檔案列出的資料夾
19
• 在一個 .pth 檔案中列出模組搜尋路徑
• PTH 檔案的位置,不同作業系統並不相同
• 可透過 site 模組的 getsitepackages()
函式取得
20
• 如果確實建立了workspace.pth 中列出的
資料夾,而且將 workspace.pth 放置到
C:WinwarePython39
21
• 如果將 workspace.pth 放置到
C:WinwarePython39libsite-packages
22
• 如果想將 PTH 檔案放置到其他資料夾,可
以使用 site.addsitedir() 函式新增
PTH 檔案的資料夾來源
23
初識物件導向
• 何時該以物件來思考或組織應用程式行為
呢?
• 可以從打算將物件的狀態與功能黏在一起
時開始…
24
25
• 可以將初始化流程,使用 __init__() 方
法定義在類別之中
• 方法前後各有兩個連線底線,意謂著在類
別以外的其他位置,不要直接呼叫
• 基本上都會有個函式可用來呼叫這類方法
26
• 在呼叫 __init__() 方法時,建立的
Account 實例會傳入作為方法的第一個參
數
• Python 的慣例中,第一個參數的名稱會命
名為 self
27
• 將 deposit() 以及 withdraw() 也定義
在 Account 類別之中
• 物件的方法第一個參數一定是物件本身
28
• 傳回物件描述字串的方法
• 若執行 str(acct) 時,就會呼叫 acct 的
__str__() 方法取得描述字串並傳回
29
• 類別中也可以定義 __repr__() 方法
• 當執行 repr(acct) 時,就會呼叫 acct
的 __repr__() 方法取得描述字串並傳回
• __str__() 字串描述是給人類看的
• __repr__() 是給程式、機器剖析用的特
定格式時,或者是包含除錯用的字串資訊
30
31
32
• 可能會有人如下誤用:
• 如果想要避免使用者直接的誤用,可以使
用 self.__xxx 的方式定義內部值域
33
34
• 不能使用 acct.__name、
acct.__number、acct.__balance 進
行屬性存取,這會引發 AttributeError
35
• 使用者仍然可以用另一種方式來存取:
• 基本上,可以直接定義一些方法來傳回內
部屬性的值
36
• 可以考慮在這類方法上加註 @property
37
• 可以使用 acct.name、acct.number、
acct.balance 的形式取得值
38
• 想要進一步提供 acct.balance =
10000 這樣的形式
39
• 被 @property 標註的 xxx 取值方法可以
使用@xxx.setter 標註
• 使用 @xxx.deleter 來標註對應的刪除值
之方法
• 取值方法傳回的值可以是即時運算的結果,
設值方法必要時可以使用流程語法等來實
作一些存取控制
40
綁定與未綁定方法
• 如果試著將 acct.deposit 或
acct.withdraw 指定給一個變數:
41
• 如果在類別中定義了一個方法,沒有任何
參數會怎樣呢?
42
• 可以透過類別名稱來呼叫它,或取得函式
物件進行呼叫:
• 取得綁定方法綁定的物件:
43
靜態方法與類別方法
• 當呼叫 acct.deposit(500) 時,會將
acct 參考的實例傳給 deposit() 的第一
個 self 參數,也可以如下取得相同效果:
• 如果想要有類似 deposit =
acct.deposit 的效果:
44
• 在定義類別時, 希望某個方法不被拿來作
為綁定方法, 可以使 @staticmethod
• acct.default('Monica', '765-
4321'),acct 也不會傳入作為
default() 的首個參數
• 建議透過類別名稱來呼叫,明確地讓類別
名稱作為靜態方法的名稱空間
45
• 在 Python 中定義的類別,也會產生對應的
物件,這個物件會是 type 的實例
46
• 類別中的方法若標註了@classmethod,
那麼第一個參數一定是接受所在類別的
type 實例
47
• 必要的話,一個自定義的類別實例,也可
以作為名稱空間
48
• 每個物件本身,都會有個 __dict__ 屬性,
當中記錄著類別或實例所擁有的特性
49
• 若想取得 __dict__ 的資料,其實可以使
用 vars() 函式
50
• 若函式或變數以類別為名稱空間,建議透
過類別名稱來呼叫或存取
• 語義上比較清楚,一眼就可以看出函式或
變數是以類別為名稱空間
• 還可以避免以下的問題:
51
• 在類別上直接新增方法:
52
• del 可用來刪除變數,或已匯入目前模組
的名稱,也可用來刪除某個物件上的屬性
53
• 模組也是個物件,也可以使用 del 來刪除
模組上定義的名稱
• del 真正的作用是刪除某物件上的屬性
54
定義運算子
55
• 建立一個有理數類別
56
57
58
• 類別的實例如何建構,實際上是由
__new__() 方法來定義
59
• 由於 __new__() 若傳回第一個參數的類別
實例,就會執行 __init__() 方法
• 藉由定義 __new__() 方法,就可以決定如
何建構物件與初始物件
60
61
62
• 想在物件被刪除時,自行定義一些清除相
關資源的行為,可以實作 __del__() 方法
63

More Related Content

PDF
10. 資料永續與交換
Justin Lin
 
PPTX
從模組到類別
Justin Lin
 
PPTX
資料永續與交換
Justin Lin
 
PDF
14. 進階主題
Justin Lin
 
PDF
物件封裝
Justin Lin
 
PPTX
進階主題
Justin Lin
 
PDF
CH04:認識物件
Justin Lin
 
PDF
9. 資料結構
Justin Lin
 
10. 資料永續與交換
Justin Lin
 
從模組到類別
Justin Lin
 
資料永續與交換
Justin Lin
 
14. 進階主題
Justin Lin
 
物件封裝
Justin Lin
 
進階主題
Justin Lin
 
CH04:認識物件
Justin Lin
 
9. 資料結構
Justin Lin
 

What's hot (20)

PDF
CH09:Collection與Map
Justin Lin
 
PPTX
5. 建構式、原型與類別
Justin Lin
 
PDF
反射與類別載入器
Justin Lin
 
PDF
認識物件
Justin Lin
 
PPTX
Ch07 使用 JSTL
Justin Lin
 
PDF
進階主題
Justin Lin
 
PDF
從模組到類別
Justin Lin
 
PPTX
11. DOM、事件與樣式
Justin Lin
 
PDF
CH16:整合資料庫
Justin Lin
 
PPT
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
 
PPTX
4. 使用物件
Justin Lin
 
PPTX
流程語法與函式
Justin Lin
 
PDF
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Justin Lin
 
PPTX
10. 進入瀏覽器
Justin Lin
 
PDF
CH17:反射與類別載入器
Justin Lin
 
PPTX
9. meta-programming
Justin Lin
 
PDF
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
 
PPT
Java SE 8 技術手冊第 4 章 - 認識物件
Justin Lin
 
PDF
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Justin Lin
 
PDF
資料結構
Justin Lin
 
CH09:Collection與Map
Justin Lin
 
5. 建構式、原型與類別
Justin Lin
 
反射與類別載入器
Justin Lin
 
認識物件
Justin Lin
 
Ch07 使用 JSTL
Justin Lin
 
進階主題
Justin Lin
 
從模組到類別
Justin Lin
 
11. DOM、事件與樣式
Justin Lin
 
CH16:整合資料庫
Justin Lin
 
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
 
4. 使用物件
Justin Lin
 
流程語法與函式
Justin Lin
 
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Justin Lin
 
10. 進入瀏覽器
Justin Lin
 
CH17:反射與類別載入器
Justin Lin
 
9. meta-programming
Justin Lin
 
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
 
Java SE 8 技術手冊第 4 章 - 認識物件
Justin Lin
 
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Justin Lin
 
資料結構
Justin Lin
 
Ad

Similar to 5. 從模組到類別 (20)

PDF
2. 從 REPL 到 IDE
Justin Lin
 
PPTX
從 REPL 到 IDE
Justin Lin
 
PDF
從 REPL 到 IDE
Justin Lin
 
PDF
Ch10
Alisha Smile
 
PDF
Ch10 教學
hungchiayang1
 
PPTX
型態與運算子
Justin Lin
 
PDF
Programming python - part 2
Che-Cheng Hsu
 
PDF
Python 2 - 快速簡介
Cheyin L
 
PDF
3.型態與運算子
Justin Lin
 
PDF
Programming python - part 1
Che-Cheng Hsu
 
PDF
Python 自然語言處理應用 - 1. 環境配置篇 - 2024 / Environment Configuration
Yung-Ting Chen
 
PDF
Python基本資料運算
吳錫修 (ShyiShiou Wu)
 
PDF
《Python 3.5 技術手冊》第二章草稿
Justin Lin
 
PDF
4. 流程語法與函式
Justin Lin
 
PDF
Learn python 1
Chia-Hao Tsai
 
PPTX
Y3CDS - Python class 01
Ting-You Xu
 
PPTX
TQC+ 程式語言 Python 05:函式
neochen2701
 
PDF
型態與運算子
Justin Lin
 
PDF
[系列活動] Python 爬蟲實戰
台灣資料科學年會
 
2. 從 REPL 到 IDE
Justin Lin
 
從 REPL 到 IDE
Justin Lin
 
從 REPL 到 IDE
Justin Lin
 
Ch10 教學
hungchiayang1
 
型態與運算子
Justin Lin
 
Programming python - part 2
Che-Cheng Hsu
 
Python 2 - 快速簡介
Cheyin L
 
3.型態與運算子
Justin Lin
 
Programming python - part 1
Che-Cheng Hsu
 
Python 自然語言處理應用 - 1. 環境配置篇 - 2024 / Environment Configuration
Yung-Ting Chen
 
Python基本資料運算
吳錫修 (ShyiShiou Wu)
 
《Python 3.5 技術手冊》第二章草稿
Justin Lin
 
4. 流程語法與函式
Justin Lin
 
Learn python 1
Chia-Hao Tsai
 
Y3CDS - Python class 01
Ting-You Xu
 
TQC+ 程式語言 Python 05:函式
neochen2701
 
型態與運算子
Justin Lin
 
[系列活動] Python 爬蟲實戰
台灣資料科學年會
 
Ad

More from Justin Lin (20)

PPTX
Ch14 簡介 Spring Boot
Justin Lin
 
PPTX
Ch13 整合 Spring MVC/Security
Justin Lin
 
PPTX
Ch12 Spring 起步走
Justin Lin
 
PPTX
Ch11 簡介 JavaMail
Justin Lin
 
PPTX
Ch10 Web 容器安全管理
Justin Lin
 
PPTX
Ch09 整合資料庫
Justin Lin
 
PPTX
Ch08 自訂標籤
Justin Lin
 
PPTX
Ch06 使用 JSP
Justin Lin
 
PPTX
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
 
PPTX
Ch04 會話管理
Justin Lin
 
PPTX
Ch03 請求與回應
Justin Lin
 
PPTX
Ch02 撰寫與設定 Servlet
Justin Lin
 
PPTX
CH1. 簡介 Web 應用程式
Justin Lin
 
PDF
13.並行、平行與非同步
Justin Lin
 
PDF
12. 除錯、測試與效能
Justin Lin
 
PDF
11. 常用內建模組
Justin Lin
 
PDF
8. open() 與 io 模組
Justin Lin
 
PDF
7. 例外處理
Justin Lin
 
PDF
6. 類別的繼承
Justin Lin
 
PDF
1. Python起步走
Justin Lin
 
Ch14 簡介 Spring Boot
Justin Lin
 
Ch13 整合 Spring MVC/Security
Justin Lin
 
Ch12 Spring 起步走
Justin Lin
 
Ch11 簡介 JavaMail
Justin Lin
 
Ch10 Web 容器安全管理
Justin Lin
 
Ch09 整合資料庫
Justin Lin
 
Ch08 自訂標籤
Justin Lin
 
Ch06 使用 JSP
Justin Lin
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
 
Ch04 會話管理
Justin Lin
 
Ch03 請求與回應
Justin Lin
 
Ch02 撰寫與設定 Servlet
Justin Lin
 
CH1. 簡介 Web 應用程式
Justin Lin
 
13.並行、平行與非同步
Justin Lin
 
12. 除錯、測試與效能
Justin Lin
 
11. 常用內建模組
Justin Lin
 
8. open() 與 io 模組
Justin Lin
 
7. 例外處理
Justin Lin
 
6. 類別的繼承
Justin Lin
 
1. Python起步走
Justin Lin
 

5. 從模組到類別