Python 從設計之初即是一門徹底的面向物件語言。掌握類別、物件、繼承、封裝等核心概念,是進階 Python 開發的基石。本文系統整理 OOP 關鍵術語、類別定義、實例化、繼承、多型、運算子多載、資料隱藏與垃圾回收機制,並附上可執行的程式碼範例。
| 術語 | 說明 |
|---|---|
| 類別 | 用戶定義的原型,定義物件的屬性(資料成員)與方法。 |
| 類別變數 | 所有實例共享的變數,定義於類別內部、方法之外。 |
| 實例變數 | 屬於特定實例的變數,通常在 __init__ 中以 self.變數 定義。 |
| 繼承 | 子類別繼承父類別的屬性與方法,可複用、擴充或覆寫。 |
| 實例化 | 根據類別建立具體物件的過程。 |
| 方法 | 定義在類別內部的函式,第一個參數慣例為 self。 |
class Employee:
"""所有員工的基礎類別"""
empCount = 0 # 類別變數
def __init__(self, name, salary):
self.name = name # 實例變數
self.salary = salary # 實例變數
Employee.empCount += 1
def display_count(self):
print(f"Total Employee {Employee.empCount}")
def display_employee(self):
print(f"Name: {self.name}, Salary: {self.salary}")
# 建立實例
emp1 = Employee("Zara", 2000)
emp2 = Employee("Manni", 5000)
emp1.display_employee()
emp2.display_employee()
print(f"Total Employee {Employee.empCount}")
輸出:
Name: Zara, Salary: 2000
Name: Manni, Salary: 5000
Total Employee 2
Python 允許執行期動態增刪改屬性:
emp1.age = 7 # 新增
emp1.age = 8 # 修改
del emp1.age # 刪除
# 內建函式操作屬性
hasattr(emp1, 'age') # 檢查存在性
getattr(emp1, 'age') # 取得值
setattr(emp1, 'age', 8) # 設定值
delattr(emp1, 'age') # 刪除屬性
每個類別自動擁有:__dict__(命名空間字典)、__doc__(文件字串)、__name__(類別名稱)、__module__(模組名)、__bases__(父類別元組)。
class Parent:
parent_attr = 100
def __init__(self):
print("Calling parent constructor")
def parent_method(self):
print("Calling parent method")
class Child(Parent):
def __init__(self):
print("Calling child constructor")
def child_method(self):
print("Calling child method")
# 覆寫父類別方法
def parent_method(self):
print("Calling overridden child method")
c = Child()
c.child_method()
c.parent_method() # 呼叫覆寫後的方法
透過定義特殊方法(如 __add__、__str__)賦予物件直觀運算行為:
class Vector:
def __init__(self, a, b):
self.a = a
self.b = b
def __str__(self):
return f'Vector ({self.a}, {self.b})'
def __add__(self, other):
return Vector(self.a + other.a, self.b + other.b)
v1 = Vector(2, 10)
v2 = Vector(5, -2)
print(v1 + v2) # Vector (7, 8)
以雙底線開頭的屬性(如 __secret)會被 Python 內部重命名為 _ClassName__secret,外部無法直接存取,但仍可透過修飾名存取:
class JustCounter:
__secret_count = 0
def count(self):
self.__secret_count += 1
print(self.__secret_count)
counter = JustCounter()
counter.count() # 1
counter.count() # 2
# print(counter.__secret_count) # AttributeError
print(counter._JustCounter__secret_count) # 2
Python 採用參考計數機制,輔以循環垃圾收集器。當物件參考計數歸零時自動回收記憶體。類別可定義 __del__ 方法在物件銷毀前執行清理工作:
class Point:
def __init__(self, x=0, y=0):
self.x, self.y = x, y
def __del__(self):
print(f"{self.__class__.__name__} destroyed")
pt1 = Point()
pt2 = pt1
pt3 = pt1
del pt1, pt2, pt3 # 最後一次 del 觸發 __del__
Python 的 OOP 機制靈活且強大,支援動態屬性、多重繼承、運算子多載與自動記憶體管理。深入理解類別與實例的關係、方法解析順序(MRO)以及特殊方法的運作,能讓你編寫出更符合 Python 風格、可維護性高的程式碼。