[DA series - Learn Python with Steem #07] 類別

[DA series - Learn Python with Steem] 是DA(@deanliu & @antonsteemit)關於「從Python程式語言實做Steem區塊鏈的入門」的系列,歡迎趕緊入列學習!

前情提要:[DA series - Learn Python with Steem #06] 函式

第#07堂課,今天我們來學習Python的~~類別

Python的類別(Class)

今天我們來介紹類別(class),應該算是程式語言中比較進階的概念了。學完這部份之後,就差不多把程式的基本概念都大致帶過了,我們就可以來試試撰寫一些比較有趣實用的程式了。

Class

什麼是class呢?其實我覺得中文的翻譯「類別」翻的挺不錯的。在程式設計的過程中,我們可以把一些「屬於同的類別」的東西放在一起,類似組成一個新的「物件」。這麼做最主要也是為了建構好理解的程式架構,讓我們在未來的呼叫中可以更得心應手。相信各位看到這裡應該完全聽不明白吧!這也是我第一次看到「Class」時的反應。沒關係,我們舉一個簡單的例子就可以了。

例如我們要設計一個程式時,要使用一些變數紀錄兩位使用者的姓名、身高、體重、性別等等。如果我們用之前的學過的東西,可能需要利用一個浮點數(float)變數來紀錄身高、體重,利用字串(string)來紀錄名字。如下:

my_name= 'Anton'
my_height = 1.75
my_weigt = 65
my_gender = 'male'

your_name = 'Felicity'
your_height = 1.6
your_weight = 53
your_gender = 'female'

目前看起來還算OK,並沒有太難看。但如果東西一多了,很容易整個程式變得混亂。Class就是在這種「多個大物件是由類似的小零件組成時」,可以拿來使用。在上面這個例子中,當我的程式撰寫到這個部份時,我意識到其實我是試著要用一些變數描述兩個「人」,而AntonFelicity都個別是一個「人」。這時我們就可以設計一個「人的Class」,並且規定:這個class裡面的元素就是我們描述一個「人」所需要的小部份,例如姓名、身高、體重、性別。或是說,身高體重等等是屬於「人」這個大概念的「屬性」。我們先以這些東西撰寫一個簡單的Class:
(參考程式碼位於tutorial_7.py

一開始跟在關鍵字class後面的Person就是這個類別的名字,通常以大寫表示。
接著看到class裡面的第一行,是一個像是 Function一樣的def關鍵字。在這裡這些「class的內建小function」被稱為methods(後面會有更完整介紹),而這邊看到的第一個:__init__(前後都有兩個底線)的method比較特別,是所有class都一定要有的method,意思為「initiate」,也就是「創建這個class的method」,或稱為Contructor。

在這個「創世method」裡面,我們丟入(self, _name, _height, _weight, _gender)五個參數。首先,所有的Class裡面的method的第一個參數都一定是self,代表他是屬於某一個class的method,而不是一個function。這個self指的就是class本身,而在這個method裡面,我們也會用self來帶指「現在這個class」。
所以在這個__init__這個method裡面,我們的就只是把其他接到的參數Assign給Class裡面的
屬性(attributes),也就是這個「人」物件的個資
。可以把這些attributes想像成class的內建變數,例如我的init內容是

self.name = _name

其中_name是我在外面創立這個class時傳送近來的參數,我把他指定給self(也就是這個class)底下一個叫做name的 attribute。同樣的道理應用在其他的參數中,所以在創立這個class的時候,我就已經將這個特殊的「人」的各個特徵都寫好到這個Class的各個屬性裡面了。
我後面主程式的部份寫到

me = Person('Anton',1.75, 65, 'Male')
print(me.name)
print(me.height)

所以現在 me就是一個Person的物件,當我們想要看看me內建了哪些屬性的時候,我們可以透過類似上面的me.name等叫法來取出。所以,上面這段程式碼執行結果為:

Anton
1.75

Methods

接著我們來試試看寫Person這個class裡面的method。
長話短說,attribute就是class裡面內建的變數(如剛剛的name),method就是class裡面內建的function。我們可以仿造上次計算BMI的function,但這次把他寫在這個大class裡面,成為一個活在Person這個大物件之下的內建method。基本上邏輯沒什麼不同:

不過這個method不像之前設計的function需要傳入(weight, height),因為規定好一定要傳入的self,也就是這個class自己,裡面已經包含了我們需要的訊息。在同一個class裡面的method可以自由使用同一個class裡面的attributes(剛剛說的name,height等等)以及其他method。所以在get_bmi這個method裡面,我們只要寫 self.weight他就會去取得「這個Person物件的體重」,使用self.height就會取得「這個Person物件的height」。

因此最後我們可以使用

me = Person('Anton',1.75, 65, 'Male')
print(me.get_bmi())

他就會知道我們是要使用me這個「Person類別」,呼叫裡面的內建的get_bmi() method。執行結果就會是:21.224啦

Functions and Methods

其實method這個字我們在先前的教學中就有提到了,例如List裡面的append、Dictionary的.update()都是常用的method。如上面所說,method有點像是那些物件的內建功能。例如:List這個物件有個內建的功能是.append()用來加上某個元素、Dictionary這個物件有個內建功能是.update(),可以用來更新字典;而String這種物建有個內建功能是split(),是將字串依照split()裡面的東西切斷。這些method僅存於某種class物件之下,所以我們學list時要學習它之下好用的methods,往往可以省去我們不少開發心力。
一個很好分辨別人寫的code是method還是function的方法是,兩者的呼叫方法有很大的不同:method是某個class的內建功能,因此必定是透過class.method()這樣的格式。如剛剛的:

me.get_bmi()

或是一些比較常用的method:

myList = []
myList.append('hey')
myDictionary = {}
myDictionary.update({'Amy':0906888222})

反觀我們上期學的function,用法會長的比較直接,不用接在誰的後面和誰的.後面,如:

print('I love you')

Homework time:練習題!

今天的練習題比較特別一點:希望大家一起來試試看在我們今天Person這個class之下加上別的method以及attribute。其中要大家試試看設計一個rename()的method,呼叫時只要傳入(name),用來更新我剛剛創件的Person物件。其中再用另一個attribute:count_update紀錄這個class一共被變更過幾次。
例如我的主程式部份輸入為:

me = Person('Anton',1.75, 65, 'Male')
print(me.name)
me.rename('Antoooon')
me.rename('Antonazzo')
print('========= After Update ===========')
print(me.name)
print(me.count_update)

輸出

Anton
========= After Update ===========
Antonazzo
2

祝大家好運啦!參考解答:tutorial_7_exercise.py

我們下篇文章再見囉~下課!

class-377117_1280.jpg
image - pixabay

Sort:  

第一个交作业拉~
image.png

怎麼不換成自己的名字勒xD

自己的數值不好看,用你的只要複製黏貼呀,哈哈哈,懶癌晚期不是蓋的🤣

Posted using Partiko Android

懶還第一個交…

Posted using Partiko Android

嘻嘻,不拘小節嘛~😉

Posted using Partiko Android

学完这节课,是不是可以小学毕业了?:D

图片.png

哎呀,你這麼一說,我開始想要賣區塊鏈上的文憑了~~~呵呵呵~~~貪財貪財,不可不可~~~

可行,第一个基于steem区块链的教育平台。

Congratulations @deanliu! You have completed the following achievement on Steemit and have been rewarded with new badge(s) :

You published a post every day of the week

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

To support your work, I also upvoted your post!

Do you like SteemitBoard's project? Then Vote for its witness and get one more award!

Coin Marketplace

STEEM 0.17
TRX 0.13
JST 0.027
BTC 59046.50
ETH 2654.73
USDT 1.00
SBD 2.50