Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

從模組到類別

1,063 views

Published on

《Python 3.5 技術手冊》第 5 章投影片

Published in: Software
  • Be the first to comment

從模組到類別

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

×