iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 27
0
自我挑戰組

從不懂,到玩上手的Python語言系列 第 27

Day27-物件導向設計 :封裝部分

學習目標

  • 定義一個空類別

  • 類別的底層機制

  • 定義一個一般類別


空類別的「定義」與「實體化」

  • 定義類別(Define a Class)

https://ithelp.ithome.com.tw/upload/images/20191013/20120926jqJWpQC8w4.png

  • 實體化(Instantiation)

https://ithelp.ithome.com.tw/upload/images/20191013/20120926dlLv05JCTq.png

範例原始碼與執行結果

  • 原始碼

https://ithelp.ithome.com.tw/upload/images/20191013/20120926X2NgfC2Z2U.png

  • 執行結果

https://ithelp.ithome.com.tw/upload/images/20191013/20120926QEErFsLnTP.png

類別/物件底層記憶體分佈

https://ithelp.ithome.com.tw/upload/images/20191013/20120926SA60RSfDFY.png

驗證類別/物件底層記憶體分佈

https://ithelp.ithome.com.tw/upload/images/20191013/20120926gAIVf4aEBk.png

定義一個類別的方法

  • 先定義一個類別有哪些資料然後定義這些資料要有哪些函數去操縱然後將資料

  • 與函數包起來並且在主程式使用包裝好的類別

https://ithelp.ithome.com.tw/upload/images/20191013/20120926rTpRt435TA.png

為何函數第一個參數是 self

  • 為了區別「類別」與「物件」內的變數

https://ithelp.ithome.com.tw/upload/images/20191013/20120926X9U3zsEqQc.png

如何取出 name 與 age 的值

  • 使用「物件名稱.成員名稱」語法

    • 屬性(物件內的變數): robert.name、robert.age

    • 方法(物件內的函數): robert.setData(…)

    https://ithelp.ithome.com.tw/upload/images/20191013/20120926T6xuz4bjyI.png

可以直接寫值到 name 或 age 上嗎?

  • 可以!!

    • 語法: 物件變數名稱.屬性名稱 = 新值

    • 範例: robert.age= 50

https://ithelp.ithome.com.tw/upload/images/20191013/20120926AuHmVLS1sa.png

老手常常把變數宣告省略

  • 原因

    • Python 在指定初值時,遇到變數不存在會自動產生變數後再給初值。

    • 省略的好處:少寫幾行系統效率稍好

    • 不省略的好處:程式碼容易了解

    https://ithelp.ithome.com.tw/upload/images/20191013/201209268WSNzDAOSj.png

重點整理

  • 定義一個類別的語法

    • 語法:class 類別名稱:

    • 範例:class Person:

  • 實體化一個類別的語法

    • 語法:物件變數名稱 體化個類別的語法

    • 範例:robert Person()

  • 類別底層機制

    • 類別自己有自己的記憶體,內含所有宣告的變數與函數,作為拷貝用的範本

    • 每實體化一個物件 = 將類別記憶體完整拷貝一份

  • 物件導向類別的寫作方法

    • 定義變數 → 定義操縱變數的函數 → 將變數、函數包起來

    • self:代表物件「自己」,可以用來抓取包含於其中的變數與函數

    • 類別的函數(方法)第一參數一定是 self。但呼叫時不需寫 self

    • 老手常常省略變數宣告,因為 Python 會自動產生


上一篇
DAY26-物件導向設計
下一篇
Day28-物件導向設計封裝部分:建構函數(Constructor)
系列文
從不懂,到玩上手的Python語言30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言