iT邦幫忙

2024 iThome 鐵人賽

DAY 17
1
自我挑戰組

每日挑戰:從零開始的 Python 學習之旅系列 第 17

【Day 17】進階語法 - 物件導向概念篇

  • 分享至 

  • xImage
  •  

Hi 大家好,

今天要開始介紹進階語法中的物件導向篇,那我們開始吧!

物件導向概念

類別

Q: 什麼是類別?
A: 舉個例子,在日常生活中,我們常見的食譜會指導我們如何做出一道菜,裡面會寫著需要哪些食材和做法。這就像是一個類別,它定義了一個屬性(食材)和行為(做法)

  • 如何定義類別

    • Python中會使用class關鍵字來定義類別,類別可用來產生一個物件,並定義了物件的屬性和方法
    • MyRecipe代表為類別名稱
    • def __init__(self)代表為定義屬性,
    • def cook(self, ingredients)代表為定義方法
    class MyRecipe:
    def __init__(self):
        self.vegetable = 10
    
    def cook(self, ingredients):
        print(self.vegetable + ingredients)
    
    my_recipe = MyRecipe()
    my_recipe.cook(10)
    
    PS D:\Project\practice> python hi.py
    20
    PS D:\Project\practice>
    

物件

Q: 什麼是物件?
A: 根據上面描述的食譜例子,我們依照食譜裡面的食材做法,最後煮出一道菜,就是一個物件

  • 如何從類別實作一個物件
    • MyRecipe代表為類別名稱
    • my_recipe = MyRecipe() 建立一個物件
    • my_recipe.cook()使用物件內定義的方法
class MyRecipe:
    def cook(self):
        print("宮保雞丁")

my_recipe = MyRecipe()
my_recipe.cook()
PS D:\Project\practice> python hi.py
宮保雞丁
PS D:\Project\practice>

繼承

類別的繼承

  • 什麼是繼承
    在各類別中相同的屬性和方法,可以抽出來放在另外一個類別中,原先和其他的類別可以透過繼承的方式來擁有

  • 繼承好處有哪些
    減少程式碼重複性,程式碼變得更簡潔,容易維護

舉個例子:

  • 定義了兩個類別,一個是Animal類別,一個是Dog類別,一個是Cat類別
  • 因為Dog和Cat的分類可以歸屬於Animal類別,因為都是動物
  • 所以可以把動物共同擁有的行為都放到Animal類別中
  • 之後只要子類別是繼承Animal類別,都可以擁有類別定義中的行為
class Animal:
    def speak(self):
        print("say hi!!!")
    
    def eat(self):
        pass

class Dog(Animal):
    def __init__(self):
        self.name = "Lucky"

class Cat(Animal):
    def __init__(self):
        self.name = "Mimi"

dog = Dog()
dog.speak()

cat = Cat()
cat.speak()
PS D:\Project\practice> python hi.py
say hi!!!
say hi!!!
PS D:\Project\practice>

有哪幾種方法

  • 實體方法
    根據Python定義,在類別中的如果要定義一實體方法時,要加上一個參數(慣例是使用self,但也可以改成其它名稱)。因為使用類別產生一物件後,物件要使用物件內的方法,會偷偷的把物件自己本身當作方法的第一個參數,也就是self
class Cat():
    def play(self):
        print("一起玩!")

kitty = Cat()
kitty.play()

如果沒有定義參數,會發生錯誤

class Cat():
    def play():    <==== 沒定義第一個參數代表自己物件本身
        print("一起玩!")

kitty = Cat()    <==== 先建立一個實體物件
kitty.play()     <==== 使用實體方法
PS D:\Project\practice> python hi.py
Traceback (most recent call last):
  File "D:\Project\practice\hi.py", line 6, in <module>
    kitty.play()
TypeError: Cat.play() takes 0 positional arguments but 1 was given
PS D:\Project\practice>
  • 類別方法
    • 如果要定義一個類別方法,要套上@classmethod裝飾器,才可以說是類別方法,因為才能夠拿到自己的類別,方法被綁定在類別裡面。
    • def play(cls)中使用的參數cls也是一種慣例的寫法,名稱也是可以改的。它代表的是會把自己的類別名稱當作是第一個參數
class Cat():
    @classmethod
    def play(cls):
        print("一起玩!")

Cat.play()
PS D:\Project\practice> python hi.py
一起玩!
PS D:\Project\practice>
  • 靜態方法
    • 如果定義的方法中不想要帶入自己的實體或類別,可以定義成一靜態方法
    • 可以套上@staticmethod裝飾器,把定義的方法視為不須帶入自己實體或是類別的方法
class Cat():
    @staticmethod
    def play():
        print("一起玩!")

# 當作類別方法呼叫
Cat.play()

# 當作實體方法呼叫
kitty = Cat()
kitty.play()
PS D:\Project\practice> python hi.py
一起玩!
一起玩!
PS D:\Project\practice>

那今天就介紹到這裡,我們明天見


上一篇
【Day 16】基礎語法 - 函數進階篇 - 續集
下一篇
【Day 18】進階語法 - 物件導向概念篇 - 續集
系列文
每日挑戰:從零開始的 Python 學習之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言