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ề lớp Property trong Python
Trong bài viết này, bạn sẽ tìm hiểu về lớp property
trong Python và cách sử dụng nó để định nghĩa các thuộc tính cho một lớp. Lớp property
giúp bạn kiểm soát cách các thuộc tính của đối tượng được truy cập và thay đổi, đồng thời duy trì tính tương thích và bảo mật của mã. Qua đó, bạn có thể đảm bảo rằng các thuộc tính của đối tượng luôn tuân thủ những quy tắc nhất định mà không cần thay đổi cách người dùng truy cập chúng.
Giới thiệu về thuộc tính trong lớp property
trong Python
Hãy xem xét ví dụ về một lớp Person
có hai thuộc tính name
và age
, và tạo ra một đối tượng mới của lớp này như sau:
class Person: def __init__(self, name, age): self.name = name self.age = age john = Person('John', 18)
Trong ví dụ này, bạn có thể thay đổi giá trị của thuộc tính age
như sau:
john.age = 19
Tuy nhiên, bạn cũng có thể gán một giá trị không hợp lệ như sau:
Bài viết này được đăng tại [free tuts .net]
john.age = -1
Điều này dẫn đến một giá trị age
không hợp lệ về mặt ngữ nghĩa, vì tuổi không thể âm. Để tránh tình trạng này, bạn có thể sử dụng câu lệnh if
để kiểm tra tính hợp lệ mỗi khi gán giá trị mới cho age
:
age = -1 if age <= 0: raise ValueError('Tuổi phải lớn hơn 0') else: john.age = age
Tuy nhiên, việc này có thể lặp lại và khó bảo trì. Để tránh lặp lại, bạn có thể định nghĩa các phương thức getter và setter.
Getter và Setter
Phương thức getter
và setter
cung cấp một giao diện để truy cập và thay đổi giá trị của thuộc tính. Trong ví dụ dưới đây, bạn có thể làm cho thuộc tính age
trở thành riêng tư và sử dụng các phương thức này để thao tác với thuộc tính đó:
class Person: def __init__(self, name, age): self.name = name self.set_age(age) def set_age(self, age): if age <= 0: raise ValueError('Tuổi phải lớn hơn 0') self._age = age def get_age(self): return self._age
Trong ví dụ trên, set_age()
là setter và get_age()
là getter. Nếu giá trị age
không hợp lệ, phương thức set_age()
sẽ ném ra một ngoại lệ ValueError
. Điều này giúp đảm bảo rằng giá trị tuổi luôn hợp lệ.
Tuy nhiên, việc sử dụng phương thức getter và setter trực tiếp có thể làm thay đổi cấu trúc của lớp, gây ra vấn đề tương thích ngược nếu lớp đã được sử dụng trước đó. Để duy trì tính tương thích, Python cung cấp lớp property
.
Lớp Property trong Python
Lớp property
trong Python cho phép bạn tạo ra một đối tượng thuộc tính. Cú pháp của nó như sau:
property(fget=None, fset=None, fdel=None, doc=None)
fget
: Phương thức để lấy giá trị của thuộc tính.fset
: Phương thức để gán giá trị cho thuộc tính.fdel
: Phương thức để xóa thuộc tính.doc
: Chuỗi chú thích cho thuộc tính.
Ví dụ dưới đây cho thấy cách sử dụng property
để tạo thuộc tính age
cho lớp Person
:
class Person: def __init__(self, name, age): self.name = name self.age = age def set_age(self, age): if age <= 0: raise ValueError('Tuổi phải lớn hơn 0') self._age = age def get_age(self): return self._age age = property(fget=get_age, fset=set_age)
Ở đây, thuộc tính age
được định nghĩa bằng cách gọi property()
và được gán cho age
. Lưu ý rằng age
là một thuộc tính của lớp, không phải của đối tượng. Khi truy cập thuộc tính này, Python sẽ gọi các phương thức tương ứng để lấy hoặc gán giá trị.
Ví dụ:
john = Person('John', 18) print(john.age) # 18 john.age = 19 print(john.age) # 19
Python sẽ gọi phương thức get_age()
để lấy giá trị và phương thức set_age()
để gán giá trị cho age
.
Kết bài
Lớp property()
trong Python mang lại sự linh hoạt và tiện lợi trong việc quản lý các thuộc tính của lớp, giúp bạn dễ dàng kiểm soát cách chúng được truy cập và thay đổi. Bằng cách sử dụng property()
, bạn có thể đảm bảo rằng các quy tắc và điều kiện được áp dụng cho các giá trị thuộc tính mà không làm ảnh hưởng đến mã nguồn hiện có. Điều này không chỉ giúp duy trì tính tương thích ngược mà còn cải thiện tính bảo mật và ổn định của ứng dụng, đặc biệt khi yêu cầu xử lý phức tạp cho các thuộc tính.