Python - 類別屬性

你好,有抱負的程式設計師!今天,我們將深入探討Python類別屬性的精彩世界。如果你是程式設計的新手,不必擔心;我會一步一步引導你完成這次旅程,就像我過去幾年教學中為無數學生所做的那樣。那麼,我們開始吧!

Python - Class Attributes

類別屬性(變數)

類別屬性是屬於整個類別而不是類別的特定實例的變數。將它們視為該類別所有物件共享的特徵。

讓我們從一個簡單的例子開始:

class Dog:
species = "Canis familiaris"

def __init__(self, name, age):
self.name = name
self.age = age

fluffy = Dog("Fluffy", 3)
buddy = Dog("Buddy", 5)

print(Dog.species)  # 輸出:Canis familiaris
print(fluffy.species)  # 輸出:Canis familiaris
print(buddy.species)  # 輸出:Canis familiaris

在這個例子中,species是一個類別屬性。它直接定義在類別內部,但不在任何方法內。所有的Dog物件都共享這個屬性。

存取類別屬性

如上述例子所示,你可以通過兩種方式存取類別屬性:

  1. 通過類別本身:Dog.species
  2. 通過類別的任何實例:fluffy.speciesbuddy.species

兩種方式都會得到相同的结果。這就像問:“狗是什麼物種?”或“Fluffy是什麼物種?” - 答案都是一樣的!

修改類別屬性

類別屬性可以修改,但要注意!當你修改類別屬性時,它會改變類別的所有實例。讓我們看一個例子:

class Cat:
species = "Felis catus"
count = 0

def __init__(self, name):
self.name = name
Cat.count += 1

whiskers = Cat("Whiskers")
mittens = Cat("Mittens")

print(Cat.count)  # 輸出:2
print(whiskers.count)  # 輸出:2
print(mittens.count)  # 輸出:2

Cat.species = "Felis silvestris catus"

print(Cat.species)  # 輸出:Felis silvestris catus
print(whiskers.species)  # 輸出:Felis silvestris catus
print(mittens.species)  # 輸出:Felis silvestris catus

在這個例子中,我們使用一個類別屬性count來追蹤我們創建了多少隻貓。每当我们創建一個新的Cat物件時,我們都會增加Cat.count。我們還通過修改Cat.species一次更改了所有貓的species

類別屬性的重要性

類別屬性在以下幾種情況下非常有用:

  1. 儲存對類別的所有實例都應該相同的常量。
  2. 追蹤所有實例的數據(如我們的Cat.count例子)。
  3. 定義可以根據需要被實例覆蓋的默認值。

內置類別屬性

Python類別帶有一些內置屬性,這些屬性可能非常有幫助。讓我們看看其中的一些:

class MyClass:
x = 5

def my_method(self):
pass

print(MyClass.__name__)  # 輸出:MyClass
print(MyClass.__doc__)  # 輸出:None(因為我們沒有提供 文檔字符串)
print(MyClass.__dict__)  # 輸出:{'__module__': '__main__', 'x': 5, 'my_method': <function MyClass.my_method at ...>}
print(MyClass.__module__)  # 輸出:__main__

存取內置類別屬性

以下是 一些常見的內置類別屬性及其存取方式:

屬性 描述 存取
name 類別的名稱 MyClass.name
doc 類別的文檔字符串 MyClass.doc
dict 包含類別命名空間的字典 MyClass.dict
module 定義類別的模組的名稱 MyClass.module
bases 包含基礎類別的元組 MyClass.bases

實例屬性

現在我們理解了類別屬性,讓我們簡短地談談實例屬性以了解它們之間的差異。實例屬性是特定於從類別創建的每個物件的。

class Student:
school = "Python High"  # 類別屬性

def __init__(self, name, grade):
self.name = name  # 實例屬性
self.grade = grade  # 實例屬性

alice = Student("Alice", 10)
bob = Student("Bob", 11)

print(Student.school)  # 輸出:Python High
print(alice.school)    # 輸出:Python High
print(bob.school)      # 輸出:Python High

print(alice.name)      # 輸出:Alice
print(bob.name)        # 輸出:Bob

Student.school = "Python University"
print(alice.school)    # 輸出:Python University
print(bob.school)      # 輸出:Python University

alice.school = "Python Elementary"
print(alice.school)    # 輸出:Python Elementary
print(Student.school)  # 輸出:Python University
print(bob.school)      # 輸出:Python University

實例屬性 vs 類別屬性

實例屬性和類別屬性之間的主要差異在於:

  1. 類別屬性被所有實例共享,而實例屬性是每個實例獨有的。
  2. 類別屬性定義在類別中但不在任何方法內,而實例屬性通常定義在__init__方法內。
  3. 修改類別屬性會影響所有實例(除非實例已經覆蓋了它),而修改實例屬性只會影響特定的實例。

請記住,當你嘗試在一個實例上存取屬性時,Python首先查找實例屬性。如果找不到,它然後查找類別屬性。這就是為什麼我們可以通過創建與之同名的實例屬性來“覆蓋”類別屬性。

以上就是了!你剛剛完成了Python類別屬性的速成課程。記住,掌握編程的關鍵是實踐。所以不要害怕實驗這些概念。創建你自己的類別,玩弄屬性,看看會發生什麼。開心編程!

Credits: Image by storyset