Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Tìm hiểu về Class Attributes trong Python
Trong bài viết này, bạn sẽ tìm hiểu về thuộc tính lớp (class attributes) trong Python, một khái niệm quan trọng giúp quản lý dữ liệu chung giữa các đối tượng của một lớp. Mình sẽ tìm hiểu cách định nghĩa class attributes, cách truy cập chúng, và khi nào nên sử dụng class attributes để viết mã một cách hiệu quả và có tổ chức hơn.
Giới thiệu về class attributes trong Python
Hãy bắt đầu với một ví dụ về lớp Circle (hình tròn):
class Circle: def __init__(self, radius): self.pi = 3.14159 self.radius = radius def area(self): return self.pi * self.radius**2 def circumference(self): return 2*self.pi * self.radius
Lớp Circle
có hai thuộc tính là pi
và radius
. Nó cũng có hai phương thức để tính diện tích và chu vi của hình tròn.
Cả pi
và radius
đều được gọi là thuộc tính thể hiện (instance attributes), nghĩa là chúng thuộc về một thể hiện cụ thể của lớp Circle
. Nếu bạn thay đổi thuộc tính của một thể hiện, nó sẽ không ảnh hưởng đến các thể hiện khác.
Bài viết này được đăng tại [free tuts .net]
Ngoài các thuộc tính thể hiện, Python cũng hỗ trợ thuộc tính lớp (class attributes). Class attributeskhông liên kết với bất kỳ thể hiện cụ thể nào của lớp mà được chia sẻ bởi tất cả các thể hiện.
Nếu bạn đã lập trình với Java hoặc C#, bạn sẽ thấy rằng class attributes tương tự như thành viên tĩnh (static members), nhưng không hoàn toàn giống nhau.
Cách định nghĩa class attributes trong Python
Để định nghĩa một class attributes t, bạn đặt nó bên ngoài phương thức __init__()
. Ví dụ:
class Circle: pi = 3.14159 def __init__(self, radius): self.radius = radius def area(self): return self.pi * self.radius**2 def circumference(self): return 2 * self.pi * self.radius
Sau đó, bạn có thể truy cập class attributes thông qua các thể hiện của lớp hoặc qua tên lớp:
c = Circle(10) print(c.pi) # Truy cập thông qua thể hiện print(Circle.pi) # Truy cập trực tiếp qua lớp
Kết quả:
3.14159 3.14159
Cách hoạt động của class attributes trong Python
Khi bạn truy cập một thuộc tính thông qua một thể hiện của lớp, Python sẽ tìm kiếm thuộc tính đó trong danh sách thuộc tính thể hiện. Nếu không tìm thấy, Python tiếp tục tìm trong danh sách class attributes và trả về giá trị của thuộc tính nếu nó có mặt ở một trong hai danh sách.
Ví dụ sau định nghĩa một lớp Test
để minh họa cách Python xử lý thuộc tính thể hiện và class attributes:
class Test: x = 10 # class attributes def __init__(self): self.x = 20 # Thuộc tính thể hiện test = Test() print(test.x) # 20 - thuộc tính thể hiện print(Test.x) # 10 - class attributes
Trong ví dụ này, thuộc tính x
tồn tại dưới dạng thuộc tính thể hiện và class attributes. Khi truy cập qua thể hiện test
, kết quả là 20
từ thuộc tính thể hiện, nhưng khi truy cập qua lớp Test
, kết quả là 10
từ class attributes
Khi nào nên sử dụng class attributes trong Python?
Lưu trữ hằng số của lớp
Khi một giá trị không thay đổi giữa các thể hiện của lớp, như hằng số, bạn nên lưu trữ nó dưới dạng class attributes. Ví dụ, hằng số pi
trong lớp Circle
là ứng viên tốt cho class attributes vì nó không thay đổi.
Theo dõi dữ liệu giữa các thể hiện
Bạn có thể sử dụng class attributes để theo dõi thông tin chung cho tất cả các thể hiện của lớp. Ví dụ:
class Circle: circle_list = [] pi = 3.14159 def __init__(self, radius): self.radius = radius self.circle_list.append(self) c1 = Circle(10) c2 = Circle(20) print(len(Circle.circle_list)) # Kết quả: 2
Định nghĩa giá trị mặc định
Đôi khi bạn muốn đặt một giá trị mặc định cho tất cả các thể hiện của lớp. Ví dụ:
class Product: default_discount = 0 def __init__(self, price): self.price = price self.discount = Product.default_discount def set_discount(self, discount): self.discount = discount def net_price(self): return self.price * (1 - self.discount) p1 = Product(100) print(p1.net_price()) # 100 p2 = Product(200) p2.set_discount(0.05) print(p2.net_price()) # 190
Kết bài
Như vậy, class attributes trong Python là công cụ hữu ích để chia sẻ dữ liệu và quản lý các giá trị chung giữa các thể hiện của một lớp. Bằng cách đặt thuộc tính bên ngoài phương thức __init__()
, chúng ta có thể dễ dàng truy cập và sử dụng nó thông qua cả tên lớp và thể hiện. Việc sử dụng class attributes không chỉ giúp mã nguồn rõ ràng, dễ bảo trì hơn, mà còn tối ưu hóa việc quản lý hằng số, dữ liệu và giá trị mặc định một cách hiệu quả.