Python - 類別屬性
你好,有抱負的程式設計師!今天,我們將深入探討Python類別屬性的精彩世界。如果你是程式設計的新手,不必擔心;我會一步一步引導你完成這次旅程,就像我過去幾年教學中為無數學生所做的那樣。那麼,我們開始吧!
類別屬性(變數)
類別屬性是屬於整個類別而不是類別的特定實例的變數。將它們視為該類別所有物件共享的特徵。
讓我們從一個簡單的例子開始:
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
物件都共享這個屬性。
存取類別屬性
如上述例子所示,你可以通過兩種方式存取類別屬性:
- 通過類別本身:
Dog.species
- 通過類別的任何實例:
fluffy.species
或buddy.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
。
類別屬性的重要性
類別屬性在以下幾種情況下非常有用:
- 儲存對類別的所有實例都應該相同的常量。
- 追蹤所有實例的數據(如我們的
Cat.count
例子)。 - 定義可以根據需要被實例覆蓋的默認值。
內置類別屬性
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 類別屬性
實例屬性和類別屬性之間的主要差異在於:
- 類別屬性被所有實例共享,而實例屬性是每個實例獨有的。
- 類別屬性定義在類別中但不在任何方法內,而實例屬性通常定義在
__init__
方法內。 - 修改類別屬性會影響所有實例(除非實例已經覆蓋了它),而修改實例屬性只會影響特定的實例。
請記住,當你嘗試在一個實例上存取屬性時,Python首先查找實例屬性。如果找不到,它然後查找類別屬性。這就是為什麼我們可以通過創建與之同名的實例屬性來“覆蓋”類別屬性。
以上就是了!你剛剛完成了Python類別屬性的速成課程。記住,掌握編程的關鍵是實踐。所以不要害怕實驗這些概念。創建你自己的類別,玩弄屬性,看看會發生什麼。開心編程!
Credits: Image by storyset