Khai báo @property trong Python
Trở lại với các bài học nâng cao của Python, hôm nay Quantrimang.com sẽ cùng bạn tìm hiểu về khai báo @property (decorator). Trong bài hướng dẫn trước, chúng ta đã thảo luận về Python Decorator, bạn nên đọc trước khi đi vào tìm hiểu về @property decorator nhé.
@property decorator trong Python
Như đã đề cập, ta có thể decorate một hàm bằng cách sử dụng decorator. Có một số decorator được tích hợp sẵn trong Python, trong đó có @property. Mục đích chính của các decorator là thay đổi các phương thức, thuộc tính class sao cho không cần thực hiện bất kỳ thay đổi nào trong code.
Theo dõi ví dụ sau:
class Student:
def __init__(self, name, marks):
self.name = name
self.marks = marks
self.gotmarks = self.name + ' obtained ' + self.marks + ' marks'
st = Student("Jaki", "25")
print(st.name)
print(st.marks)
print(st.gotmarks)
Chương trình xuất output như sau:
Jaki
25
Jaki obtained 25 marks
Bây giờ, ta muốn thay đổi thuộc tính name của class student thì chuyện gì sẽ xảy ra? Thêm 3 dòng sau vào code trước:
st.name = "Anusha"
print(st.name)
print(st.gotmarks)
Chương trình sẽ trả về như sau:
Jaki
25
Jaki obtained 25 marks
Anusha
Jaki obtained 25 marks
Lưu ý rằng thuộc tính name đã thay đổi nhưng câu được tạo bởi thuộc tính gotmarks
vẫn giống như lúc đặt trong quá trình khởi tạo đối tượng student.
Bây giờ ta muốn gotmarks
thay đổi khi tên sinh viên được cập nhật. Hãy sử dụng @property decorator
Chúng ta có thể giải quyết vấn đề này với đoạn code sau:
class Student:
def __init__(self, name, marks):
self.name = name
self.marks = marks
# self.gotmarks = self.name + ' obtained ' + self.marks + ' marks'
def gotmarks(self):
return self.name + ' obtained ' + self.marks + ' marks'
st = Student("Jaki", "25")
print(st.name)
print(st.marks)
print(st.gotmarks())
st.name = "Anusha"
print(st.name)
print(st.gotmarks())
Chương trình xuất output như sau:
Jaki
25
Jaki obtained 25 marks
Anusha
Anusha obtained 25 marks
Yêu cầu đã được giải quyết. Chúng tôi đã loại bỏ thuộc tính gotmarks
khỏi hàm tạo và thêm một phương thức có tên gotmarks()
.
Tuy nhiên với thay đổi này, người dùng nào đang sử dụng class sẽ gặp rắc rối vì cần phải thay thế tất cả các thuộc tính gotmarks
bằng hàm gotmarks()
. Giả sử có 1000 dòng code thì việc sửa đổi sẽ cực kỳ phức tạp, mất công và dễ nhầm lẫn.
Giải quyết vấn đề trên bằng cách sử dụng @property decorator
Ta sẽ giải quyết vấn đề này bằng cách sử dụng @property decorator python. Theo dõi code sau:
@property
def gotmarks(self):
return self.name + ' obtained ' + self.marks + ' marks'
Chương trình sẽ cung cấp output giống như trước, nhớ xóa () phía sau gotmarks khi in kết quả. Bạn chỉ cần khai báo @property ở trên hàm gotmarks()
để nó có sẵn sử dụng trong các lần sau.
Với decorator này, bạn đã có thể tiếp tục giữ nguyên nội dung code cũ mà vẫn mở rộng tính năng cho hàm.
Thiết lập @property setter
Trong Python, sử dụng @property (decorators) để khai báo setter.
Bây giờ, giả sử chúng ta muốn update thuộc tính name và marks khi thay đổi giá trị của gotmarks, theo dõi đoạn code sau:
class Student:
def __init__(self, name, marks):
self.name = name
self.marks = marks
# self.gotmarks = self.name + ' obtained ' + self.marks + ' marks'
@property
def gotmarks(self):
return self.name + ' obtained ' + self.marks + ' marks'
@gotmarks.setter
def gotmarks(self, sentence):
name, rand, marks = sentence.split(' ')
self.name = name
self.marks = marks
st = Student("Jaki", "25")
print(st.name)
print(st.marks)
print(st.gotmarks)
print("##################")
st.name = "Anusha"
print(st.name)
print(st.gotmarks)
print("##################")
st.gotmarks = 'Golam obtained 36'
print(st.gotmarks)
print(st.name)
print(st.marks)
Để update giá trị của name và marks khi thay đổi giá trị của gotmarks, bạn sử dụng setter trong @proprety decorator.
Lưu ý, viết @gotmarks.setter
nghĩa là ta đang áp dụng setter trên phương thức gotmarks, sau đó ta sẽ tách câu và cập nhật giá trị của name và marks.
Sử dụng @proprety decorator cùng với setter phía trên sẽ tạo ra output như sau:
Jaki
25
Jaki obtained 25 marks
##################
Anusha
Anusha obtained 25 marks
##################
Golam obtained 36 marks
Golam
36
Bạn nên đọc
-
Hàm print() trong Python
-
Viết chương trình tính căn bậc hai của một số bằng Python
-
Lệnh break và continue trong Python
-
Tìm hiểu Class và Object trong Python
-
10 sự thật thú vị về ngôn ngữ lập trình Python
-
Cách viết lệnh, thụt lề và chú thích trong Python
-
Hàm input() trong Python
-
Hàm pow() trong Python
-
Ma trận trong Python


Cũ vẫn chất
-
Cách chuyển mã phông chữ với Unikey
Hôm qua -
Cách viết sớ cúng giao thừa, viết sớ cúng tất niên 2025
Hôm qua -
Code Ta là tiểu tiên nhỏ mới nhất
2 ngày -
Luyện tập gõ 10 ngón giúp tăng tốc đánh máy
Hôm qua 39 -
6 phần mềm VPN miễn phí tốt nhất cho PC
Hôm qua -
Blood Field - Cỏ Máu
-
Thơ về hoa đào hay đón Tết đến Xuân về
Hôm qua -
Lọ hoa trên bàn thờ đặt bên nào? Trái hay phải?
2 ngày -
Laptop bị nóng do đâu?
2 ngày -
Code My Hero Mania Roblox mới nhất
2 ngày