Menu
CoddyTech

Decorator thuộc tính

Thuộc phần Lập trình hướng đối tượng trong hành trình Python của Coddy. Bài học 10 trên 64.

Bộ trang trí @property cho phép bạn truy cập các phương thức như thuộc tính, giúp lấy và đặt giá trị một cách gọn gàng. Cách này hữu ích cho việc đóng gói, cho phép bạn thêm logic xác thực hoặc các giá trị được tính toán mà không cần thay đổi giao diện công khai của lớp.

Đây là ví dụ về một lớp sử dụng @property:

class Circle:
    def __init__(self, radius):
        self._radius = radius
    
    @property
    def radius(self):
        return self._radius
    
    @property
    def area(self):
        return 3.14159 * self._radius ** 2

Lưu ý rằng chúng ta dùng self._radius để lưu giá trị thực tế. Nếu dùng self.radius bên trong phương thức getter, phương thức này sẽ gọi lại chính nó, dẫn đến đệ quy vô hạn.

Tạo một hình tròn và truy cập các thuộc tính:

my_circle = Circle(5)

Truy cập thuộc tính như các thuộc tính thông thường:

print(my_circle.radius)
print(my_circle.area)

Đầu ra:

5
78.53975

Lưu ý rằng bạn không dùng dấu ngoặc đơn () khi truy cập thuộc tính. Chúng trông giống thuộc tính nhưng lại chạy code của phương thức.

Thêm một hàm setter để cho phép thay đổi giá trị và kiểm tra tính hợp lệ:

class Circle:
    def __init__(self, radius):
        self._radius = radius
    
    @property
    def radius(self):
        return self._radius
    
    @radius.setter
    def radius(self, value):
        if value > 0:
            self._radius = value
        else:
            print("Radius must be positive!")

Giờ bạn có thể đặt bán kính như một thuộc tính:

my_circle = Circle(5)
my_circle.radius = 10  # Sử dụng phương thức setter
print(my_circle.radius)  # Sử dụng phương thức getter

Đầu ra:

10

Điểm chính: @property khiến phương thức trông như thuộc tính, còn @property_name.setter cho phép bạn kiểm soát cách gán giá trị, nhờ đó xác thực dữ liệu và đóng gói dữ liệu.

Tự làm thử

Bài học này không có thử thách code.

quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Python online