iT邦幫忙

2024 iThome 鐵人賽

DAY 20
1
自我挑戰組

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

【Day 20】進階語法 - 物件導向概念篇 - 續集

  • 分享至 

  • xImage
  •  

Hi 大家好,

今天要開始介紹基礎語法中的物件導向篇之續集,那我們開始吧!

物件導向多型 (Polymorphism)

Q: 什麼是多型?
A: 就是允許同一個方法不同的類別中,實作不同的行為,會得到不同的執行結果

舉個例子如下:

  • 定義了三個不同的類別DogCatBird
  • 在三個類別中定義了相同名稱的方法speak(),只是方法內實作的細節不一樣
class Dog:
    def speak(self):
        print("Woof!") 

class Cat:
    def speak(self):
        print("Meow!") 

class Bird:
    def speak(self):
        print("Tweet!") 

dog = Dog()
cat = Cat()
brid = Bird()

dog.speak()
cat.speak()
brid.speak()
PS D:\Project\practice> python hi.py
Woof!
Meow!
Tweet!
PS D:\Project\practice>
  • 三個方法的名稱雖然都相同,但是它們都是獨立的,記憶體位置都不一樣
print(id(Dog.speak))
print(id(Cat.speak))
print(id(Bird.speak))
PS D:\Project\practice> python hi.py
2201429200864
2201429201024
2201429201184
PS D:\Project\practice>

如何提升程式碼擴充性

依賴注入 (Dependency Injection)

Q: 什麼是依賴注入?
A: 指的將一個類別所需的依賴項目(即其他類別或物件)透過外部傳入的方式注入到這個類別中,而不是在類別內部自行建立這些依賴項目。

舉例說明:

  • 定義兩個運動項目類別BasketballFootball,和一個學生類別Student
  • 原本定義的學生類別中,並沒有明確的定義運動嗜好項目是什麼,這些項目是由外部傳入
  • 在學生類別中,先傳入一喜歡的運動項目,並且儲存成嗜好hobby,也可以執行嗜好類別中定義的方法play
  • 如果學生的嗜好改變,可以透過學生類別Student中的change_hobby方法,重新設定喜歡的項目
  • 重新設定後仍然可以執行嗜好類別中的方法
class Basketball:
    name = 'basketball'

    def play(self):
        print('play basketball.')

class Football:
    name = 'football'

    def play(self):
        print('play football.')

class Student:
    def __init__(self, name, hobby):
        self.name = name
        self.hobby = hobby
        print('My name is %s and %s is my hobby.'%(self.name, self.hobby.name))
    
    def change_hobby(self, hobby):
        self.hobby = hobby 
        print("%s changes hobby to %s" % (self.name, self.hobby.name))
    
    def play(self):
        print(self.name, end = ' ')
        self.hobby.play()
# 定義學生喜歡的運動項目
Leo = Student('Leo', Basketball())

# 執行運動項目中的方法
Leo.play()

# 改變喜歡的運動項目
Leo.change_hobby(Football())

# 重新執行運動項目中的方法
Leo.play()
PS D:\Project\practice> python hi.py
My name is Leo and basketball is my hobby.
Leo play basketball.
Leo changes hobby to football
Leo play football.
PS D:\Project\practice> 

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


上一篇
【Day 19】進階語法 - 物件導向概念篇 - 續集
下一篇
【Day 21】錯誤和例外狀況篇
系列文
每日挑戰:從零開始的 Python 學習之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言