初學者指南:深入了解 Python 實體變數

更新日期: 2024 年 10 月 11 日

在學習 Python 的過程中,物件導向程式設計(Object-Oriented Programming, OOP) 是一個關鍵概念。

OOP 允許我們透過 類別(Class) 來創建 實體(Instance),從而更有效地組織和管理程式碼。

在物件導向中,實體變數(Instance Variables) 是理解類別和實體之間關係的重要元素。

本文將為新手詳細介紹 Python 中的實體變數,解釋其作用、如何使用,以及與類別變數的區別。


什麼是實體變數?

實體變數 是定義在類別的 __init__ 方法中,並以 self 關鍵字引用的變數。

它們屬於實體本身,每個實體都有自己的實體變數,彼此之間互不影響。

實體變數用於存儲實體的狀態或屬性。

特點

  • 獨立性:每個實體的實體變數都是獨立的,修改一個實體的實體變數不會影響其他實體。
  • 通過 self 訪問:實體變數必須通過 self 關鍵字來定義和訪問。

實體變數的定義與使用

定義實體變數

__init__ 方法中,使用 self 關鍵字來定義實體變數。

class 類別名稱:
    def __init__(self, 參數1, 參數2):
        self.變數1 = 參數1
        self.變數2 = 參數2

示例

class Person:
    def __init__(self, name, age):
        self.name = name  # 實體變數
        self.age = age    # 實體變數

創建實體並使用實體變數

person1 = Person("Alice", 30)
person2 = Person("Bob", 25)

print(person1.name)  # 輸出:Alice
print(person2.age)   # 輸出:25

實體變數與類別變數的區別

類別變數

  • 定義在類別內,且不在任何方法內。
  • 所有實體共享相同的類別變數。
  • 通過類別名或 self 訪問。

比較

項目實體變數類別變數
定義位置__init__ 方法內類別內部,方法外部
關鍵字self.變數名直接定義變數名
所屬屬於實體,彼此獨立屬於類別,所有實體共享
訪問方式self.變數名類別名.變數名self.變數名

示例

class Circle:
    pi = 3.14159  # 類別變數

    def __init__(self, radius):
        self.radius = radius  # 實體變數

    def area(self):
        return Circle.pi * self.radius ** 2

示例:建立一個簡單的學生類別

定義類別

class Student:
    school = "Python 學院"  # 類別變數

    def __init__(self, name, student_id):
        self.name = name             # 實體變數
        self.student_id = student_id # 實體變數
        self.grades = []             # 實體變數

    def add_grade(self, grade):
        self.grades.append(grade)

    def average_grade(self):
        if not self.grades:
            return 0
        return sum(self.grades) / len(self.grades)

使用類別

# 創建學生實體
student1 = Student("Alice", "S001")
student2 = Student("Bob", "S002")

# 添加成績
student1.add_grade(90)
student1.add_grade(85)

student2.add_grade(75)
student2.add_grade(80)

# 計算平均成績
print(f"{student1.name} 的平均成績:{student1.average_grade()}")  # 輸出:Alice 的平均成績:87.5
print(f"{student2.name} 的平均成績:{student2.average_grade()}")  # 輸出:Bob 的平均成績:77.5

# 訪問類別變數
print(student1.school)  # 輸出:Python 學院
print(student2.school)  # 輸出:Python 學院

修改和訪問實體變數

修改實體變數

可以直接通過實體來修改實體變數。

student1.name = "Alice Smith"
print(student1.name)  # 輸出:Alice Smith

動態添加實體變數

也可以在程式執行過程中,為實體動態添加新的實體變數。

student1.major = "Computer Science"
print(student1.major)  # 輸出:Computer Science

注意:動態添加的實體變數只屬於該實體,其他實體無法訪問。

print(student2.major)  # 會引發 AttributeError

實體變數的應用場景

  • 存儲實體的個別狀態:每個實體都有自己的狀態,使用實體變數來存儲。
  • 封裝資料:將與實體相關的資料封裝在實體變數中,保護資料的完整性。
  • 實現實體之間的區別:實體變數使得每個實體都有獨特的屬性。

結論

實體變數是 Python 物件導向程式設計中的重要概念,透過它們,我們可以:

  • 為每個實體存儲獨立的屬性。
  • 封裝與實體相關的資料,增強程式的模組化和可維護性。
  • 與類別變數區分開來,更靈活地管理實體和類別的屬性。

理解並熟練使用實體變數,將有助於你更好地掌握 Python 的物件導向編程,編寫出更清晰、可重用的程式碼。


進一步學習

  • 類別方法與靜態方法:瞭解 @classmethod@staticmethod 的用法。
  • 封裝性:學習如何使用私有屬性(__變數名)和保護屬性(_變數名)來實現資料封裝。
  • 繼承與多型:深入研究類別之間的繼承關係,實現更複雜的物件導向設計。
  • 特殊方法:瞭解 __str____repr____len__ 等特殊方法,提升類別的功能性。

Similar Posts