iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
Software Development

燃燒大三的成果發表系列 第 5

燃燒大三的成果發表第五天 - 類別(Class)、建構子(Construct)

  • 分享至 

  • xImage
  •  

今天開始要來介紹物件導向啦~~~~ 今天主要會介紹類別(Class)以及建構子(Construct)的概念,物件導向程式設計又稱OOP,從字面上來看就是以物件為目標寫程式,為什麼要學習物件導向?這裡我也不多贅述,優點見仁見智,有些人認為用物件導向概念寫出來的程式,方便學習、好維護......等,有些人不這麼認為,真的用過了就知道有哪些優點。

物件(Object) & 實例(Instance)

那麼什麼是物件呢?在python的世界任何都可以物件。物件(Object)可以把他想成是一個概念,在不同方面提到的object,也有不同的解釋,一般來說我們指的物件是類別的實例(Instance)。

底下我設計一個類別的架構,基於類別(Class)實例化之後的物件(object),他有屬性(Attributes)和方法(Methods),一個人就好像一個物件,這個人的身高、體重、年齡就像是屬性,這個人的能做的事情就像是方法。

類別(Class)

以底下這段程式碼為例:

class Person(object):
    def __init__(self, name, height, weight, age):
        self.name = name
        self.height = height
        self.weight = weight
        self.age = age
    
    def introduce_myself(self):
        print("Hi, I am {name} {height}cm {weight}kg {age} years old".format(name=self.name, height=self.height, weight=self.weight, age=self.age))

if __name__ == '__main__':
    Jacky = Person("Jacky", 180, 70, 18)
    Sandy = Person("Sandy", 160, 50, 18)
    Jacky.introduce_myself() #Hi, I am Jacky 180cm 70kg 18 years old
    Sandy.introduce_myself() #Hi, I am Sandy 160cm 50kg 18 years old

我設計一個類別,他會有名字、身高體重以及年齡,在14、15行透過呼叫Person這個類別,基於Person做實例化,建立兩個物件叫做Jacky、Sandy,並且輸入了名字、身高體重以及年齡作為參數,然後呼叫類別建立物件的時候,一定會先經過__init__(建構子),我輸入的這些參數,在建構子裡面就能夠定義屬於物件自己的屬性,Jacky的屬性就是屬於這個物件的並不會與Sandy共用。

建構子(Construct)

從上文聽起來感覺建構子必須且重要,那什麼時候會用到建構子(?!) 我自己的經驗是在遇到輸入的資料需要共享給多個函數使用的時候,這個物件的屬性,物件隨時都能夠使用,不需要透過函數一直傳下去,因為遇到這種情況,所以我覺得建構子很重要,這是什麼意思呢?

讓我們來看看下面這段程式碼:

class Person(object):

    def __init__(self, name, height, weight, age):
        self.name = name
        self.height = height
        self.weight = weight
        self.age = age

    def introduce_myself(self):
        print("Hi, I am {name} {height}cm {weight}kg {age} years old".format(name=self.name, height=self.height, weight=self.weight, age=self.age)) #Hi, I am Jacky 180cm 70kg 18 years old
        self.ten_years_later()

    def ten_years_later(self):
        height = self.height + 10
        weight = self.weight + 5
        age = self.age + 10
        print("Ten years, height {height}cm weight {weight}kg age {age}years old".format(height=height, weight=weight, age=age)) #Ten years, height 190cm weight 75kg age 28years old

    def introduce_myself_func(name, height, weight, age):
        print("Hi, I am {name} {height}cm {weight}kg {age} years old".format(name=name, height=height, weight=weight, age=age))
        Person.ten_years_later_func(name, height, weight, age)

    def ten_years_later_func(name, height, weight, age):
        height = height + 10
        weight = weight + 5
        age = age + 10
        print("Ten years, height {height}cm weight {weight}kg age {age}years old".format(name=name, height=height, weight=weight, age=age))


if __name__ == '__main__':
    Jacky = Person("Jacky", 180, 70, 18)
    Jacky.introduce_myself()
    Person.introduce_myself_func("Jacky", 180, 70, 18)

這兩段的結果是一樣的,除了架構上不同,對我來說更深刻的差別是,13-17行是有透過建構子建立物件屬性,所以就可以在裡面直接透過物件取得物件屬性,想用隨時都可以用;23-27行是沒有透過建構子建立物件屬性,所以要取得參數只能透過呼叫時輸入參數,當有多個函數都需要用到屬性的時候,你呼叫函式的時候,就需要一直輸入相同的參數,相當的麻煩,架構上也不對。

今天分享的東西雖然不多,但是卻十分地重要,明天我要來分享方法(Metohd)。


上一篇
燃燒大三的成果發表第四天 - pep8
下一篇
燃燒大三的成果發表第六天 - 方法(Method)
系列文
燃燒大三的成果發表30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言