Python 物件導向程式設計入門 (12):從 Class 開始

在學習 Python 的過程中,很多人一開始會從變數、資料型別與函數開始。

當我們開始處理更複雜的程式時,就需要一種更有組織性的方式來管理程式碼。
這時候,「物件導向程式設計(Object-Oriented Programming, OOP)」就登場了。

在 OOP 當中,最核心的概念就是 類別(Class)。類別可以看作是一份藍圖,用來描述資料的結構與行為;

而依照這份藍圖所建立的實體,則被稱為 物件(Object)。透過類別與物件,我們不僅能讓程式更有條理,也能讓程式碼更容易重用與擴展。

資料型別基礎

Python 提供了多種存儲資料的方式。每種資料都有其特定的型別(Type),決定了可以對其執行的操作。

a_string = "Cool String"
an_int = 12
print(type(a_string))  # 輸出 ""
print(type(an_int))    # 輸出 ""
    

使用 type() 函數可以檢查變數的型別。不同型別支援不同的操作—例如,不能對整數使用字串方法,也不能將兩個字典相加。

Different Python data types visualization with integers, strings, lists, and dictionaries shown as colorful abstract objects

什麼是類別?

類別 (Class) 是資料型別的模板,描述了這種型別將持有的資訊以及程式設計師如何與這些資料互動。使用 class 關鍵字定義類別。

根據 Python 編碼風格指南 (PEP 8),類別名稱應採用大寫字母開頭,以便於識別。

class CoolClass:
    pass
      

上面的例子中,我們創建了一個名為 CoolClass 的類別。我們使用 pass 關鍵字表示類別主體有意留空,以避免縮排錯誤。

物件導向程式設計 (OOP)

類別的實例也被稱為物件 (Object)。定義類別並創建物件來表示程式職責的模式稱為物件導向程式設計。

print(type(cool_instance))  
# 輸出 ""
    

使用 type() 函數可以確認物件的類別。在 Python 中,__main__ 表示「當前運行的文件」,因此可以理解為「在當前腳本中定義的 CoolClass 類別」。

物件導向程式設計是組織代碼的強大方式,可以提高可讀性、可維護性和代碼重用性。

Object Oriented Programming concept with interconnected classes and objects in a structured hierarchy

類別變數

什麼是類別變數?

當我們希望同一數據對類別的每個實例都可用時,使用類別變數。類別變數對於該類別的每個實例都是相同的。

如何定義和訪問

在類別定義的縮排部分中定義類別變數,並使用 object.variable 語法訪問物件的所有類別變數。

class Musician:
    title = "Rockstar"

drummer = Musician()
print(drummer.title)  # 輸出 "Rockstar"

guitarist = Musician()
print(guitarist.title)  # 也輸出 "Rockstar"
  

在上面的例子中,title 是類別變數,對 Musician 類別的所有實例都具有相同的值。

方法 – 類別中的函數

方法 (Methods) 是定義為類別一部分的函數。方法中的第一個參數始終是調用該方法的物件。按照慣例,我們將這個第一個參數命名為 self

class Dog:
    dog_time_dilation = 7
    
    def time_explanation(self):
        print("Dogs experience {} years for every 1 human year.".format(self.dog_time_dilation))

pipi_pitbull = Dog()
pipi_pitbull.time_explanation()  # 輸出 "Dogs experience 7 years for every 1 human year."
  

在上例中,我們創建了一個帶有 time_explanation 方法的 Dog 類別。注意,調用方法時我們沒有傳遞任何參數,但在函數體內可以引用 self。這是因為當調用方法時,會自動將調用該方法的物件作為第一個參數傳遞。

屬性函數

實例變數和類別變數在 Python 中的訪問方式類似。這不是偶然的,它們都被視為物件的屬性 (Attributes)。如果我們嘗試訪問既不是類別變數也不是物件實例變數的屬性,Python 將拋出 AttributeError

hasattr() 函數

如果物件具有給定屬性,則返回 True,否則返回 False

hasattr(object, "attribute")
      

getattr() 函數

返回給定物件和屬性的值。可以提供第三個參數作為默認值,如果物件沒有給定屬性,則返回此默認值。

getattr(object, "attribute", default)
      
hasattr(attributeless, "fake_attribute") # 返回 False
getattr(attributeless, "other_fake_attribute", 800) # 返回 800,默認值

理解 self 關鍵字

self 關鍵字是 Python 中物件導向程式設計的核心。它指的是調用方法的物件本身,使方法能夠訪問和修改該物件的實例變數和類別變數。

class SearchEngineEntry:
    def __init__(self, url):
        self.url = url

codecademy = SearchEngineEntry("www.codecademy.com")
wikipedia = SearchEngineEntry("www.wikipedia.org")

print(codecademy.url)  # 輸出 "www.codecademy.com"
print(wikipedia.url)  # 輸出 "www.wikipedia.org"
    

建構子使用傳入的參數創建實例變數,使每個物件都能維護自己的狀態。這是物件導向程式設計的強大之處—能夠創建具有相同行為但持有不同數據的多個物件。

總結

學習 Python 的 class 與物件導向程式設計,能幫助我們把程式碼寫得更有結構,也更容易維護。

  • 類別:提供了設計資料型別的模板
  • 物件:是類別的具體實例
  • 類別變數與實例變數:讓我們能區分共享資料與獨立資料
  • 方法與 self:幫助我們設計物件的行為,並操作其屬性

掌握這些基礎後,你已經能開始設計屬於自己的類別,並在程式中建立出更符合邏輯的模組化結構。

Class to object instantiation process visualization showing blueprint transforming into concrete object

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端