Class variables vs Instance variables
Hiện tượng lạ
Phần tiêu đề “Hiện tượng lạ”class Dog: tricks = [] # Class variable
def add_trick(self, trick): self.tricks.append(trick)
# Tạo 2 dogsfido = Dog()buddy = Dog()
# Fido học trickfido.add_trick("roll over")print(fido.tricks) # ['roll over']
# Buddy cũng biết trick của Fido?!print(buddy.tricks) # ['roll over'] ❌ What?!What the Python?! Tại sao buddy biết trick của fido?! 😱
Giải thích
Phần tiêu đề “Giải thích”Class variable = Shared
Phần tiêu đề “Class variable = Shared”class Dog: tricks = [] # Shared bởi TẤT CẢ instances!
# Tất cả dogs dùng CHUNG listfido = Dog()buddy = Dog()
print(fido.tricks is buddy.tricks) # True - Cùng object!Instance variable = Riêng biệt
Phần tiêu đề “Instance variable = Riêng biệt”class Dog: def __init__(self): self.tricks = [] # Mỗi instance có list riêng
fido = Dog()buddy = Dog()
print(fido.tricks is buddy.tricks) # False - Khác objectCách dùng đúng
Phần tiêu đề “Cách dùng đúng”✅ Instance variables trong __init__
Phần tiêu đề “✅ Instance variables trong __init__”class Dog: def __init__(self, name): self.name = name # Instance variable self.tricks = [] # Instance variable
def add_trick(self, trick): self.tricks.append(trick)
fido = Dog("Fido")buddy = Dog("Buddy")
fido.add_trick("roll over")print(fido.tricks) # ['roll over']print(buddy.tricks) # [] ✅✅ Class variables cho constants
Phần tiêu đề “✅ Class variables cho constants”class Circle: pi = 3.14159 # Class variable - constant
def __init__(self, radius): self.radius = radius # Instance variable
def area(self): return Circle.pi * self.radius ** 2✅ Class variables cho shared config
Phần tiêu đề “✅ Class variables cho shared config”class Database: connection_pool = [] # Shared pool max_connections = 10 # Config
def __init__(self, db_name): self.db_name = db_name # Instance-specificLookup order
Phần tiêu đề “Lookup order”class MyClass: class_var = "class"
def __init__(self): self.instance_var = "instance"
obj = MyClass()
# Instance variableprint(obj.instance_var) # "instance"
# Class variable qua instanceprint(obj.class_var) # "class"
# Class variable qua classprint(MyClass.class_var) # "class"Ghi đè class variable
Phần tiêu đề “Ghi đè class variable”class Counter: count = 0 # Class variable
c1 = Counter()c2 = Counter()
# Đọc qua instanceprint(c1.count) # 0 (từ class)
# Gán qua instance → Tạo instance variable!c1.count = 10print(c1.count) # 10 (instance var)print(c2.count) # 0 (class var)print(Counter.count) # 0 (class var)Tóm tắt
Phần tiêu đề “Tóm tắt”Class vs Instance variables:
- Class var: Shared bởi tất cả instances
- Instance var: Riêng cho mỗi instance
- ✅ Dùng
__init__cho instance vars- ⚠️ Mutable class vars (list, dict) rất nguy hiểm!
Pattern:
class MyClass: class_var = "shared" # Class variable
def __init__(self): self.instance_var = "unique" # Instance variable