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 14 trên 64.
Decorator thuộc tính giúp bạn kiểm soát cách truy cập và chỉnh sửa thuộc tính, đồng thời vẫn giữ cú pháp thuộc tính đơn giản.
Đây là ví dụ về một lớp có getter thuộc tính:
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
@property
def age(self):
return self._ageDùng thuộc tính như một thuộc tính thông thường:
person = Person("Alice", 30)
print(person.age)Đầu ra:
30Lưu ý, bạn truy cập age mà không dùng dấu ngoặc đơn, dù thực ra thao tác này gọi một phương thức (method).
Thêm setter để xác thực dữ liệu khi đặt giá trị:
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if value < 0:
raise ValueError("Age cannot be negative")
self._age = valueGiờ bạn có thể đặt tuổi và tự động kiểm tra tính hợp lệ:
person = Person("Alice", 30)
person.age = 31 # Dùng setter để kiểm tra tính hợp lệ
print(person.age) # Dùng getter
# Dòng này sẽ gây ra lỗi:
# person.age = -5 # ValueError: Tuổi không thể là số âmĐầu ra:
31Tạo các thuộc tính tính toán để tính giá trị:
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
return self.width * self.height
rect = Rectangle(5, 3)
print(rect.area) # Tính 5 * 3 = 15Đầu ra:
15Điểm chính: Decorator thuộc tính giúp phương thức trông giống thuộc tính. Dùng @property cho getter và @attribute_name.setter cho setter. Cách này cho phép xác thực dữ liệu và tính toán giá trị, đồng thời giữ cú pháp truy cập thuộc tính đơn giản.
Thử thách
Trung bìnhHoàn thành lớp Temperature trong temperature.py để chuyển đổi giữa độ C và độ F. Sau đó dùng lớp này trong driver.py để kiểm tra các phép chuyển đổi nhiệt độ. Làm theo các chú thích TODO trong cả hai tệp để thực hiện từng bước.
In mỗi phép chuyển đổi theo định dạng [celsius]°C is [fahrenheit]°F, giữ nguyên giá trị độ C như đã nhập và dùng giá trị độ F do Python tính. Không làm tròn hoặc định dạng các số. Hai dòng mà driver tạo ra là:
25°C is 77.0°F
37.0°C is 98.6°FTự làm thử
# TODO: Nhập lớp (class) Temperature từ module temperature
# Kiểm tra lớp:
# TODO: Tạo một instance nhiệt độ ở 25°C
temp = None # Thay bằng instance Temperature thực tế
# TODO: In ra cả hai giá trị Celsius và Fahrenheit
# TODO: Dùng định dạng: "25°C is 77.0°F" (in nguyên hai giá trị, không làm tròn hoặc định dạng thêm)
# TODO: Đặt nhiệt độ thành 98.6°F
# TODO: In lại cả hai giá trị để xác nhận việc chuyển đổi hoạt động đúng
# TODO: Dùng cùng định dạng như trướcBà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
1Nền tảng về lập trình hướng đối tượng
Tệp bên ngoàiGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTham số selfPhương thứcThuộc tínhPhương thức khởi tạo (__init__)Ôn tập: máy tính đơn giản4Kế thừa
Kế thừa cơ bảnHàm super()Ghi đè phương thứcKế thừa đa lớpThứ tự phân giải phương thứcÔn tập: hệ thống phân cấp nhân viên2Decorator
Giới thiệu về decoratorDecorator thuộc tínhDecorator phương thức tĩnhDecorator phương thức lớp5Tính đa hình
Xem lại cách ghi đè phương thứcKiểu gõ vịtLớp và phương thức trừu tượngThiết kế giao diệnÔn tập: máy tính hình học8Các khái niệm OOP nâng cao
Kết hợp và kế thừaMixinPhương thức tĩnh và phương thức lớpDecorator lớpTrình quản lý ngữ cảnhTự luyện tập: Trình biên dịch Python online