O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

從模組到類別

162 visualizações

Publicada em

深入模組管理
初識物件導向
學習定義類別
定義運算子

Publicada em: Tecnologia
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

從模組到類別

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

×