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

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

發佈留言

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

High Quality

Lorem ipsum dolor sit amet, consectetur adipiscing elitsed do eiusmod tempor.

Fast Delivery

Lorem ipsum dolor sit amet, consectetur adipiscing elitsed do eiusmod tempor.

Best Warranty

Lorem ipsum dolor sit amet, consectetur adipiscing elitsed do eiusmod tempor.