Mẹo Khi nào tôi nên sử dụng python trang trí thuộc tính?

Mẹo Hướng dẫn Khi nào tôi nên sử dụng python trang trí thuộc tính? Chi Tiết

Hoàng Trung Dũng đang tìm kiếm từ khóa Khi nào tôi nên sử dụng python trang trí thuộc tính? được Cập Nhật vào lúc : 2022-12-24 15:14:06 . Với phương châm chia sẻ Thủ Thuật Hướng dẫn trong nội dung bài viết một cách Chi Tiết 2022. Nếu sau khi Read tài liệu vẫn ko hiểu thì hoàn toàn có thể lại Comment ở cuối bài để Mình lý giải và hướng dẫn lại nha.

Với Python, bạn hoàn toàn có thể tạo những thuộc tính được quản lý trong những lớp của tớ. Bạn hoàn toàn có thể sử dụng những thuộc tính được quản lý, còn được gọi là thuộc tính, khi bạn cần sửa đổi triển khai nội bộ của chúng mà không thay đổi API công khai minh bạch của lớp. Việc đáp ứng những API ổn định hoàn toàn có thể giúp bạn tránh vi phạm mã của người tiêu dùng khi họ nhờ vào những lớp và đối tượng của bạn

Nội dung chính Show
    Quản lý thuộc tính trong lớp học của bạnPhương pháp Getter và Setter trong PythonPhương pháp tiếp cận PythonicBắt đầu với # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 của PythonTạo thuộc tính với # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4Sử dụng # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 làm Trang tríCung cấp những thuộc tính chỉ đọcTạo thuộc tính đọc-ghiCung cấp những thuộc tính chỉ ghiĐưa # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 của Python vào hoạt độngXác thực giá trị đầu vàoCung cấp những thuộc tính được tính toánBộ nhớ đệm thuộc tính được tính toánGhi nhật ký truy cập thuộc tính và đột biếnQuản lý xóa thuộc tínhTạo API lớp tương thích ngượcThuộc tính ghi đè trong những lớp conPhần kết luậnKhi nào bạn nên sử dụng trình trang trí Python?Trình trang trí thuộc tính trong Python là gì?quyền lợi của việc sử dụng trong trang trí là gì?Ý nghĩa của @property trong Python là gì?

Các thuộc tính được cho là cách phổ biến nhất để tạo những thuộc tính được quản lý một cách nhanh gọn và theo phong cách Pythonic thuần túy nhất

Trong hướng dẫn này, bạn sẽ học cách

    Tạo những thuộc tính hoặc thuộc tính được quản lý trong những lớp học của bạnThực hiện đánh giá thuộc tính lười biếng và đáp ứng những thuộc tính được tính toánTránh những phương thức setter và getter để làm cho những lớp của bạn giống Pythonic hơnTạo những thuộc tính chỉ đọc, chỉ đọc và chỉ ghiTạo những API nhất quán và tương thích ngược cho những lớp của bạn

Bạn cũng tiếp tục viết một vài ví dụ thực tế sử dụng

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 để xác thực tài liệu đầu vào, tính toán những giá trị thuộc tính một cách linh hoạt, ghi nhật ký mã của bạn, v.v. Để tận dụng tối đa hướng dẫn này, bạn nên biết kiến ​​thức cơ bản về lập trình hướng đối tượng và trình trang trí trong Python

Tiền thưởng miễn phí. 5 Suy nghĩ về Làm chủ Python, một khóa học miễn phí dành riêng cho những nhà phát triển Python cho bạn thấy lộ trình và tư duy mà bạn sẽ cần để đưa những kỹ năng Python của tớ lên một tầm cao mới

Quản lý thuộc tính trong lớp học của bạn

Khi bạn định nghĩa một lớp trong ngôn từ lập trình hướng đối tượng, hoàn toàn có thể bạn sẽ kết thúc với một số trong những thể hiện và lớp. Nói cách khác, bạn sẽ nhận được những biến hoàn toàn có thể truy cập thông qua thể hiện, lớp hoặc thậm chí cả hai, tùy thuộc vào ngôn từ. Các thuộc tính đại diện hoặc giữ trạng thái bên trong của một đối tượng nhất định mà bạn sẽ thường xuyên cần truy cập và thay đổi

Thông thường, bạn có ít nhất hai phương pháp để quản lý một thuộc tính. Bạn hoàn toàn có thể truy cập và thay đổi thuộc tính trực tiếp hoặc bạn hoàn toàn có thể sử dụng những phương thức. Phương thức là những hiệu suất cao gắn sát với một lớp nhất định. Chúng đáp ứng những hành vi và hành vi mà một đối tượng hoàn toàn có thể thực hiện với tài liệu và thuộc tính bên trong của nó

Nếu bạn hiển thị những thuộc tính của tớ cho những người dân tiêu dùng, thì chúng sẽ trở thành một phần của API công khai minh bạch của những lớp của bạn. Người dùng của bạn sẽ truy cập và thay đổi chúng trực tiếp trong mã của tớ. Sự cố xảy ra khi bạn cần thay đổi cách triển khai nội bộ của một thuộc tính nhất định

Giả sử bạn đang thao tác trên một lớp

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6. Việc thực hiện ban đầu có một thuộc tính gọi là # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7. Bạn hoàn thành xong mã hóa lớp và đáp ứng lớp đó cho những người dân tiêu dùng cuối của bạn. Họ khởi đầu sử dụng # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6 trong mã của tớ để tạo ra nhiều dự án công trình bất Động sản và ứng dụng tuyệt vời. Làm tốt lắm

Bây giờ, giả sử rằng bạn có một người tiêu dùng quan trọng đến gặp bạn với một yêu cầu mới. Họ không thích

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6 tàng trữ bán kính nữa. Họ cần một thuộc tính >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 0 công khai minh bạch

Tại thời điểm này, việc xóa

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7 để khởi đầu sử dụng >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 0 hoàn toàn có thể phá vỡ mã của một số trong những người dân tiêu dùng cuối của bạn. Bạn cần quản lý tình huống này theo một cách khác ngoài việc vô hiệu # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7

Các ngôn từ lập trình như Java và C++ khuyến khích bạn không bao giờ để lộ những thuộc tính của tớ để tránh loại vấn đề này. Thay vào đó, bạn nên đáp ứng những phương thức getter và setter, còn được gọi là bộ truy cập và bộ biến hóa, tương ứng. Các phương pháp này đáp ứng một phương pháp để thay đổi cách triển khai nội bộ những thuộc tính của bạn mà không cần thay đổi API công khai minh bạch của bạn

Ghi chú. Các phương thức getter và setter thường được xem là phản mẫu và là tín hiệu của thiết kế hướng đối tượng kém. Đối số chính đằng sau đề xuất này là những phương thức này phá vỡ sự đóng gói. Chúng được cho phép bạn truy cập và thay đổi những thành phần của đối tượng của bạn

Cuối cùng, những ngôn từ này còn có nhu yếu các phương thức getter và setter vì chúng không đáp ứng cách phù hợp để thay đổi cách triển khai bên trong của một thuộc tính nếu một yêu cầu nhất định thay đổi. Việc thay đổi triển khai nội bộ sẽ yêu cầu sửa đổi API, điều này hoàn toàn có thể phá vỡ mã của người tiêu dùng cuối của bạn

Loại bỏ những quảng cáo

Phương pháp Getter và Setter trong Python

Về mặt kỹ thuật, không còn gì ngăn cản bạn sử dụng getter và setter trong Python. Đây là cách tiếp cận này sẽ trông ra làm sao

# point.py class Point: def __init__(self, x, y): self._x = x self._y = y def get_x(self): return self._x def set_x(self, value): self._x = value def get_y(self): return self._y def set_y(self, value): self._y = value

Trong ví dụ này, bạn tạo

>>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 4 với hai thuộc tính không công khai minh bạch là >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 5 và >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 6 để giữ tọa độ Descartes của điểm trong tầm tay

Ghi chú. Python không còn khái niệm về công cụ sửa đổi quyền truy cập, ví dụ như

>>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 7, >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 8 và >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 9, để hạn chế quyền truy cập vào những thuộc tính và phương thức. Trong Python, sự khác lạ là Một trong những thành viên lớp công khai minh bạch và không công khai minh bạch

Nếu bạn muốn báo hiệu rằng một thuộc tính hoặc phương thức nhất định là không công khai minh bạch, thì bạn phải sử dụng Python nổi tiếng để thêm tiền tố vào tên bằng dấu gạch dưới (

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 60). Đó là nguyên do đằng sau việc đặt tên cho những thuộc tính >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 5 và >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 6

Lưu ý rằng đây chỉ là một quy ước. Nó không ngăn bạn và những lập trình viên khác truy cập những thuộc tính bằng phương pháp sử dụng ký hiệu dấu chấm, như trong

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 63. Tuy nhiên, đó là thực tế xấu để vi phạm quy ước này

Để truy cập và thay đổi giá trị của

>>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 5 hoặc >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 6, bạn hoàn toàn có thể sử dụng những phương thức getter và setter tương ứng. Hãy tiếp tục và lưu định nghĩa ở trên của >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 4 trong mô-đun Python và nhập lớp vào trình bao tương tác của bạn

Đây là cách bạn hoàn toàn có thể thao tác với

>>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 4 trong mã của tớ

>>>

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4

Với

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 68 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 69, bạn hoàn toàn có thể truy cập những giá trị hiện tại của >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 5 và >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 6. Bạn hoàn toàn có thể sử dụng phương thức setter để tàng trữ một giá trị mới trong thuộc tính được quản lý tương ứng. Từ mã này, bạn hoàn toàn có thể xác nhận rằng Python không hạn chế quyền truy cập vào những thuộc tính không công khai minh bạch. Bạn có làm như vậy hay là không là tùy thuộc vào bạn

Phương pháp tiếp cận Pythonic

Mặc dù ví dụ bạn vừa thấy sử dụng phong cách mã hóa Python, nhưng nó rất khác Pythonic. Trong ví dụ này, những phương thức getter và setter không thực hiện thêm bất kỳ xử lý nào với

>>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 5 và >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 6. Bạn hoàn toàn có thể viết lại >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 4 theo cách ngắn gọn và Pythonic hơn

>>>

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 2

Mã này phát hiện ra một nguyên tắc cơ bản. Việc hiển thị những thuộc tính cho những người dân tiêu dùng cuối là thông thường và phổ biến trong Python. Bạn tránh việc phải làm lộn xộn những lớp của tớ với những phương thức getter và setter mọi lúc, điều này nghe có vẻ như khá thú vị. Tuy nhiên, làm thế nào bạn hoàn toàn có thể xử lý những thay đổi yêu cầu dường như liên quan đến thay đổi API?

Không in như Java và C++, Python đáp ứng những công cụ hữu ích được cho phép bạn thay đổi cách triển khai cơ bản của những thuộc tính mà không cần thay đổi API công khai minh bạch của bạn. Cách tiếp cận phổ biến nhất là biến thuộc tính của bạn thành thuộc tính

Ghi chú. Another common approach to provide managed attributes is to use descriptors. Tuy nhiên, trong hướng dẫn này, bạn sẽ tìm hiểu về những thuộc tính

Các thuộc tính đại diện cho một hiệu suất cao trung gian giữa một thuộc tính đơn giản (hoặc trường) và một phương thức. Nói cách khác, chúng được cho phép bạn tạo những phương thức hoạt động và sinh hoạt giải trí in như những thuộc tính. Với những thuộc tính, bạn hoàn toàn có thể thay đổi phương pháp tính toán thuộc tính đích bất kể lúc nào bạn cần

Ví dụ: bạn hoàn toàn có thể biến cả

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 35 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 36 thành thuộc tính. Với thay đổi này, bạn hoàn toàn có thể tiếp tục truy cập chúng dưới dạng thuộc tính. Bạn cũng tiếp tục có một phương pháp cơ bản giữ # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 35 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 36 sẽ được cho phép bạn sửa đổi triển khai nội bộ của chúng và thực hiện hành vi đối với chúng ngay trước khi người tiêu dùng của bạn truy cập và thay đổi chúng

Ghi chú. Các thuộc tính không dành riêng cho Python. Các ngôn từ như JavaScript, C#, Kotlin và những ngôn từ khác cũng đáp ứng những công cụ và kỹ thuật để tạo những thuộc tính với tư cách là thành viên của lớp

Ưu điểm chính của những thuộc tính Python là chúng được cho phép bạn hiển thị những thuộc tính của tớ như một phần của API công khai minh bạch. Nếu bạn cần thay đổi triển khai cơ bản, thì bạn hoàn toàn có thể biến thuộc tính thành thuộc tính bất kỳ lúc nào mà không gặp nhiều trở ngại vất vả

Trong những phần sau, bạn sẽ tìm hiểu cách tạo thuộc tính trong Python

Loại bỏ những quảng cáo

Bắt đầu với # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 của Python

Python là cách Pythonic để tránh những phương thức getter và setter chính thức trong mã của bạn. Chức năng này được cho phép bạn chuyển thành thuộc tính hoặc thuộc tính được quản lý. Vì

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 là một hiệu suất cao tích hợp sẵn nên bạn hoàn toàn có thể sử dụng nó mà không cần nhập bất kể thứ gì. Ngoài ra, # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 là để đảm bảo hiệu suất tối ưu

Ghi chú. Người ta thường gọi

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 là một hiệu suất cao tích hợp sẵn. Tuy nhiên, # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 14 là một lớp được thiết kế để hoạt động và sinh hoạt giải trí như một hàm hơn là một lớp thông thường. Đó là nguyên do tại sao hầu hết những nhà phát triển Python gọi nó là một hiệu suất cao. Đó cũng là nguyên do tại sao # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 không tuân theo quy ước Python cho

Hướng dẫn này tuân theo những phương pháp phổ biến gọi

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 là một hàm chứ không phải là một lớp. Tuy nhiên, trong một số trong những phần, bạn sẽ thấy nó được gọi là một lớp để thuận tiện cho việc lý giải

Với

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4, bạn hoàn toàn có thể đính kèm những phương thức getter và setter cho những thuộc tính lớp đã cho. Bằng cách này, bạn hoàn toàn có thể xử lý việc triển khai nội bộ cho thuộc tính đó mà không để lộ những phương thức getter và setter trong API của tớ. Bạn cũng hoàn toàn có thể chỉ định cách xử lý việc xóa thuộc tính và đáp ứng chuỗi tài liệu phù hợp cho thuộc tính của tớ

Đây là chữ ký đầy đủ của

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6

Hai đối số đầu tiên nhận những đối tượng hàm sẽ đóng vai trò của những phương thức getter (

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 19) và setter (# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 80). Đây là một bản tóm tắt về những gì mỗi đối số làm

Đối sốMô tả

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 19Hàm trả về giá trị của thuộc tính được quản lý# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 80Hàm được cho phép bạn đặt giá trị của thuộc tính được quản lý# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 83Hàm xác định cách thuộc tính được quản lý xử lý việc xóa# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 84Chuỗi đại diện cho chuỗi tài liệu của thuộc tính

Giá trị trả về của

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 đó đó là thuộc tính được quản lý. Nếu bạn truy cập thuộc tính được quản lý, ví dụ như trong # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 86, thì Python sẽ tự động gọi # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 87. Nếu bạn gán một giá trị mới cho thuộc tính, ví dụ như trong # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 88, thì Python gọi # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 89 bằng phương pháp sử dụng đầu vào # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 400 làm đối số. Cuối cùng, nếu bạn chạy câu lệnh # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 401, thì Python sẽ tự động gọi # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 402

Ghi chú. Ba đối số đầu tiên của

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 nhận những đối tượng hàm. Bạn hoàn toàn có thể coi một đối tượng hàm là tên gọi hàm mà không cần gọi cặp dấu ngoặc đơn

Bạn hoàn toàn có thể sử dụng

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 84 để đáp ứng chuỗi tài liệu phù hợp cho thuộc tính của tớ. Bạn và những lập trình viên đồng nghiệp của bạn sẽ hoàn toàn có thể đọc chuỗi tài liệu đó bằng Python. Đối số # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 84 cũng hữu ích khi bạn đang thao tác với trình soạn thảo mã và IDE tương hỗ truy cập chuỗi tài liệu

Bạn hoàn toàn có thể sử dụng

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 như một hiệu suất cao hoặc một công cụ trang trí để xây dựng những thuộc tính của tớ. Trong hai phần sau, bạn sẽ học cách sử dụng cả hai phương pháp. Tuy nhiên, bạn nên biết trước rằng phương pháp trang trí phổ biến hơn trong hiệp hội Python

Tạo thuộc tính với # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4

Bạn hoàn toàn có thể tạo một thuộc tính bằng phương pháp gọi

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 với một tập hợp những đối số thích hợp và gán giá trị trả về của nó cho một thuộc tính lớp. Tất cả những đối số cho # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 là tùy chọn. Tuy nhiên, bạn thường đáp ứng ít nhất một hàm setter

Ví dụ sau đây đã cho tất cả chúng ta biết cách tạo một lớp

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6 với một thuộc tính tiện dụng để quản lý bán kính của nó

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." )

Trong đoạn mã này, bạn tạo

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6. Trình khởi tạo lớp, # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 413, lấy # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 414 làm đối số và tàng trữ nó trong một thuộc tính không công khai minh bạch mang tên là # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 415. Sau đó, bạn xác định ba phương pháp không công khai minh bạch# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 416 trả về giá trị hiện tại của # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 415# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 418 lấy # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 400 làm đối số và gán nó cho # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 415# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 421 xóa thuộc tính thể hiện # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 415

Khi bạn đã có ba phương thức này, bạn tạo một thuộc tính lớp mang tên là

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7 để tàng trữ đối tượng thuộc tính. Để khởi tạo thuộc tính, bạn chuyển ba phương thức làm đối số cho # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4. Bạn cũng chuyển một chuỗi tài liệu phù hợp cho thuộc tính của tớ

Trong ví dụ này, bạn sử dụng để cải tổ kĩ năng đọc mã và tránh nhầm lẫn. Bằng cách đó, bạn biết đúng chuẩn phương thức nào đi vào từng đối số

Để dùng thử

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6, hãy chạy đoạn mã sau trong trình bao Python của bạn

>>>

>>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property.

Thuộc tính

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7 ẩn thuộc tính phiên bản không công khai minh bạch # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 415, hiện là thuộc tính được quản lý của bạn trong ví dụ này. Bạn hoàn toàn có thể truy cập và chỉ định trực tiếp # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7. Trong nội bộ, Python tự động gọi # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 416 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 418 khi cần. Khi bạn thực thi # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 431, Python gọi # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 421, thao tác này sẽ xóa # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 415 phía dưới

Sử dụng Hàm # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 434 làm Phương thức GetterHiển thị/Ẩn

Bên cạnh việc sử dụng những hàm được đặt tên thông thường để đáp ứng những phương thức getter trong thuộc tính của tớ, bạn cũng hoàn toàn có thể sử dụng những hàm

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 434

Đây là phiên bản của

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6 trong đó thuộc tính # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7 sử dụng hàm # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 434 làm phương thức getter của nó

>>>

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6

Nếu hiệu suất cao của phương thức getter của bạn bị số lượng giới hạn chỉ trả về giá trị hiện tại của thuộc tính được quản lý, thì sử dụng hàm

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 434 hoàn toàn có thể là một cách tiếp cận hữu ích

Thuộc tính là thuộc tính lớp quản lý thuộc tính thể hiện. Bạn hoàn toàn có thể coi một thuộc tính là một tập hợp những phương thức được kết phù phù hợp với nhau. Nếu bạn kiểm tra thận trọng

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7, thì bạn hoàn toàn có thể tìm thấy những phương thức thô mà bạn đã đáp ứng dưới dạng những đối số # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 19, # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 80 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 83

>>>

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 3

Bạn hoàn toàn có thể truy cập những phương thức getter, setter và deleter trong một thuộc tính nhất định thông qua

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 444, # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 445 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 446 tương ứng

Các thuộc tính cũng ghi đè những mô tả. Nếu bạn sử dụng để kiểm tra những thành viên nội bộ của một thuộc tính nhất định, thì bạn sẽ tìm thấy

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 448 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 449 trong list. Các phương pháp này đáp ứng một setup mặc định của

Ghi chú. Nếu bạn muốn làm rõ hơn về triển khai nội bộ của

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 14 với tư cách là một lớp, hãy xem phần mô tả trong tài liệu

Ví dụ: triển khai mặc định của

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 448 sẽ chạy khi bạn không đáp ứng phương thức thiết lập tùy chỉnh. Trong trường hợp này, bạn nhận được # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 453 vì không còn cách nào để đặt thuộc tính cơ bản

Loại bỏ những quảng cáo

Sử dụng # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 làm Trang trí

Trang trí ở khắp mọi nơi trong Python. Chúng là những hàm lấy một hàm khác làm đối số và trả về một hàm mới với hiệu suất cao được thêm vào. Với một trình trang trí, bạn hoàn toàn có thể đính kèm những thao tác trước và sau xử lý vào một hiệu suất cao hiện có

Khi ra mắt

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4, cú pháp trang trí không khả dụng. Cách duy nhất để xác định những thuộc tính là chuyển những phương thức getter, setter và deleter, như bạn đã học trước đây. Cú pháp trang trí đã được thêm vào và ngày này, sử dụng # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 làm công cụ trang trí là phương pháp phổ biến nhất trong hiệp hội Python

Cú pháp của trình trang trí gồm có đặt tên của hàm trang trí với ký hiệu

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 457 ở đầu ngay trước định nghĩa của hàm bạn muốn trang trí

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 1

Trong đoạn mã này,

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 458 hoàn toàn có thể là một hàm hoặc lớp nhằm mục đích trang trí cho # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 459. Cú pháp này tương đương như sau

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 8

Dòng mã ở đầu cuối gán lại tên

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 460 để giữ kết quả của việc gọi # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 461. Lưu ý rằng đây là cú pháp in như bạn đã sử dụng để tạo thuộc tính trong phần trên

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 của Python cũng hoàn toàn có thể hoạt động và sinh hoạt giải trí như một công cụ trang trí, vì vậy bạn hoàn toàn có thể sử dụng cú pháp # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 463 để tạo những thuộc tính của tớ một cách nhanh gọn

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 40

Mã này trông khá khác so với cách tiếp cận phương thức getter và setter.

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6 giờ đây trông Pythonic và sạch sẽ hơn. Bạn không cần sử dụng những tên phương thức như # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 416, # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 418 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 421 nữa. Bây giờ bạn có ba phương thức có cùng tên in như thuộc tính rõ ràng và mô tả. Làm thế nào là hoàn toàn có thể?

Phương pháp trang trí để tạo thuộc tính yêu cầu xác định phương thức đầu tiên sử dụng tên công khai minh bạch cho thuộc tính được quản lý cơ bản, trong trường hợp này là

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7. Phương pháp này sẽ thực hiện logic getter. Trong ví dụ trên, dòng 7 đến dòng 11 thực hiện phương thức đó

Dòng 13 đến 16 xác định phương thức setter cho

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7. Trong trường hợp này, cú pháp khá khác. Thay vì sử dụng lại # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 463, bạn sử dụng # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 471. Tại sao bạn nên phải làm điều đó?

>>>

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 41

Bên cạnh

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 444, # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 445, # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 446 và một loạt những thuộc tính và phương thức đặc biệt khác, # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 14 cũng đáp ứng # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 477, # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 478 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 479. Ba phương thức này đều trả về một thuộc tính mới

Khi bạn trang trí phương thức

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 480 thứ hai với # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 471 (dòng 13), bạn tạo một thuộc tính mới và gán lại tên Lever lớp # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7 (dòng 8) để giữ nó. Thuộc tính mới này chứa cùng một tập hợp những phương thức của thuộc tính ban đầu ở dòng 8 với việc tương hỗ update phương thức setter mới được đáp ứng ở dòng 14. Cuối cùng, cú pháp của trình trang trí gán lại thuộc tính mới cho tên cấp lớp # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7

Cơ chế xác định phương thức deleter cũng tương tự. Lần này, bạn cần sử dụng trình trang trí

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 484. Khi kết thúc quá trình, bạn nhận được một thuộc tính chính thức với những phương thức getter, setter và deleter

Cuối cùng, làm thế nào bạn hoàn toàn có thể đáp ứng những chuỗi tài liệu phù hợp cho những thuộc tính của tớ khi bạn sử dụng phương pháp trang trí?

Việc triển khai

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6 mới hoạt động và sinh hoạt giải trí in như ví dụ trong phần trên

>>>

>>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property.

Bạn không cần sử dụng cặp dấu ngoặc đơn để gọi phương thức

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 480. Thay vào đó, bạn hoàn toàn có thể truy cập vào # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7 như cách bạn truy cập vào một thuộc tính thông thường, đây là mục tiêu sử dụng chính của những thuộc tính. Chúng được cho phép bạn coi những phương thức là thuộc tính và chúng đảm nhiệm việc tự động gọi tập phương thức cơ bản

Dưới đây là bản tóm tắt một số trong những điểm quan trọng cần nhớ khi bạn tạo những thuộc tính bằng phương pháp trang trí

    Trình trang trí # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 463 phải trang trí phương thức getterChuỗi tài liệu phải đi theo phương thức getterCác phương thức setter và deleter phải được trang trí bằng tên của phương thức getter cộng với # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 490 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 491, tương ứng

Cho đến thời điểm này, bạn đã tạo những thuộc tính được quản lý bằng phương pháp sử dụng

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 làm hiệu suất cao và làm công cụ trang trí. Nếu bạn kiểm tra những triển khai # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6 của tớ cho tới nay, thì bạn sẽ lưu ý rằng những phương thức getter và setter của chúng không thêm bất kỳ xử lý tương hỗ update thực sự nào vào những thuộc tính của bạn

Nói chung, bạn nên tránh biến những thuộc tính không cần xử lý thêm thành những thuộc tính. Sử dụng những thuộc tính trong những tình huống đó hoàn toàn có thể làm cho mã của bạn

    Dài dòng không cần thiếtGây nhầm lẫn cho những nhà phát triển khácChậm hơn mã nhờ vào những thuộc tính thông thường

Trừ khi bạn cần thứ gì đó hơn là quyền truy cập thuộc tính trần, đừng viết thuộc tính. Chúng làm tiêu tốn lãng phí thời gian của CPU và quan trọng hơn, chúng làm tiêu tốn lãng phí thời gian của bạn. Cuối cùng, bạn nên tránh viết những phương thức getter và setter rõ ràng và sau đó gói chúng trong một thuộc tính. Thay vào đó, hãy sử dụng trình trang trí

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 463. Đó hiện là cách Pythonic nhất để đi

Loại bỏ những quảng cáo

Cung cấp những thuộc tính chỉ đọc

Có lẽ trường hợp sử dụng cơ bản nhất của

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 là đáp ứng những thuộc tính chỉ đọc trong những lớp của bạn. Giả sử bạn cần một lớp >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 4 không được cho phép người tiêu dùng thay đổi giá trị ban đầu của tọa độ của nó, # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 497 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 498. Để đạt được tiềm năng này, bạn hoàn toàn có thể tạo >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 4 như trong ví dụ sau

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 43

Tại đây, bạn tàng trữ những đối số đầu vào trong những thuộc tính

>>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 5 và >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 6. Như bạn đã biết, việc sử dụng dấu gạch dưới ở đầu (# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 60) trong tên sẽ cho những nhà phát triển khác biết rằng chúng là thuộc tính không công khai minh bạch và tránh việc truy cập bằng phương pháp sử dụng ký hiệu dấu chấm, ví dụ như trong # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 203. Cuối cùng, bạn xác định hai phương thức getter và trang trí chúng bằng # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 463

Bây giờ bạn có hai thuộc tính chỉ đọc,

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 35 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 36, làm tọa độ của bạn

>>>

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 44

Ở đây,

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 207 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 208 là những ví dụ cơ bản về thuộc tính chỉ đọc. Hành vi của tớ nhờ vào bộ mô tả cơ bản mà # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 14 đáp ứng. Như bạn đã thấy, việc triển khai # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 448 mặc định sẽ tăng # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 453 khi bạn không xác định phương thức setter phù hợp

Bạn hoàn toàn có thể thực hiện triển khai

>>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 4 này xa hơn một chút ít và đáp ứng những phương thức thiết lập rõ ràng để đưa ra một ngoại lệ tùy chỉnh với những thông báo rõ ràng và phức tạp hơn

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 45

Trong ví dụ này, bạn xác định một ngoại lệ tùy chỉnh mang tên là

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 213. Ngoại lệ này được cho phép bạn tùy chỉnh cách triển khai lớp >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 4 không bao giờ thay đổi của tớ. Bây giờ, cả hai phương thức setter đều tăng ngoại lệ tùy chỉnh của bạn bằng một thông báo rõ ràng hơn. Hãy tiếp tục và thử dùng >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 4 tăng cấp cải tiến của bạn

Tạo thuộc tính đọc-ghi

Bạn cũng hoàn toàn có thể sử dụng

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 để đáp ứng những thuộc tính được quản lý với kĩ năng đọc-ghi. Trong thực tế, bạn chỉ việc đáp ứng phương thức getter (“read”) và phương thức setter (“write”) thích hợp cho những thuộc tính của tớ để tạo những thuộc tính được quản lý đọc-ghi

Giả sử bạn muốn lớp

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6 của tớ có thuộc tính >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 0. Tuy nhiên, việc lấy bán kính và đường kính trong trình khởi tạo lớp dường như không thiết yếu vì bạn hoàn toàn có thể tính toán cái này bằng phương pháp sử dụng cái kia. Đây là một # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6 quản lý # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7 và >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 0 dưới dạng thuộc tính đọc-ghi

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 46

Ở đây, bạn tạo một lớp

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6 với một # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7 đọc-ghi. Trong trường hợp này, phương thức getter chỉ trả về giá trị bán kính. Phương thức setter quy đổi giá trị đầu vào cho bán kính và gán nó cho # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 415 không công khai minh bạch, đây là biến bạn sử dụng để tàng trữ tài liệu ở đầu cuối

Có một rõ ràng tinh tế cần lưu ý trong triển khai mới này của

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6 và thuộc tính # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7 của nó. Trong trường hợp này, trình khởi tạo lớp gán trực tiếp giá trị đầu vào cho thuộc tính # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7 thay vì tàng trữ nó trong một thuộc tính không công khai minh bạch chuyên được dùng, ví dụ như # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 415

Tại sao?

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6 cũng triển khai thuộc tính >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 0 làm thuộc tính. Phương thức getter tính toán đường kính bằng bán kính. Phương thức setter làm điều gì đó tò mò. Thay vì tàng trữ đường kính đầu vào # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 400 trong một thuộc tính chuyên được dùng, nó sẽ tính toán bán kính và ghi kết quả vào # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7

Đây là cách hoạt động và sinh hoạt giải trí của

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6 của bạn

>>>

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 47

Cả

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7 và >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 0 đều hoạt động và sinh hoạt giải trí như những thuộc tính thông thường trong những ví dụ này, đáp ứng API công khai minh bạch Pythonic sạch cho lớp # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6 của bạn

Loại bỏ những quảng cáo

Cung cấp những thuộc tính chỉ ghi

Bạn cũng hoàn toàn có thể tạo những thuộc tính chỉ ghi bằng phương pháp điều chỉnh cách bạn triển khai phương thức getter cho những thuộc tính của tớ. Ví dụ: bạn hoàn toàn có thể làm cho phương thức getter của tớ đưa ra một ngoại lệ mọi khi người tiêu dùng truy cập giá trị thuộc tính cơ bản

Đây là một ví dụ về xử lý mật khẩu với thuộc tính chỉ ghi

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 48

Trình khởi tạo của

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 237 lấy tên người tiêu dùng và mật khẩu làm đối số và tàng trữ chúng lần lượt trong # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 238 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 239. Bạn sử dụng một thuộc tính để quản lý cách lớp của bạn xử lý mật khẩu đầu vào. Phương thức getter tăng # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 453 bất kể lúc nào người tiêu dùng cố truy xuất mật khẩu hiện tại. Điều này biến # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 239 thành thuộc tính chỉ ghi

>>>

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 49

Trong ví dụ này, bạn tạo

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 242 dưới dạng phiên bản # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 237 với mật khẩu ban đầu. Phương thức setter băm mật khẩu và tàng trữ nó trong # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 244. Lưu ý rằng khi bạn nỗ lực truy cập trực tiếp vào # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 239, bạn sẽ nhận được một # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 453. Cuối cùng, việc gán một giá trị mới cho # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 239 sẽ kích hoạt phương thức setter và tạo một mật khẩu băm mới

Trong phương thức setter của

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 239, bạn sử dụng # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 249 để tạo một chuỗi ngẫu nhiên 32 byte làm muối của hàm băm của bạn. Để tạo mật khẩu băm, bạn sử dụng. Sau đó, bạn tàng trữ mật khẩu được băm trong thuộc tính không công khai minh bạch # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 244. Làm như vậy đảm nói rằng bạn không bao giờ lưu mật khẩu văn bản gốc trong bất kỳ thuộc tính hoàn toàn có thể truy xuất nào

Đưa # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 của Python vào hoạt động và sinh hoạt giải trí

Cho đến giờ, bạn đã học cách sử dụng hàm có sẵn

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 của Python để tạo những thuộc tính được quản lý trong những lớp của tớ. Bạn đã sử dụng # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 như một hiệu suất cao và như một công cụ trang trí và tìm hiểu về sự khác lạ giữa hai cách tiếp cận này. Bạn đã và đang học cách tạo những thuộc tính chỉ đọc, chỉ đọc và ghi

Trong những phần sau, bạn sẽ viết mã một số trong những ví dụ giúp bạn làm rõ hơn về thực tế những trường hợp sử dụng phổ biến của

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4

Xác thực giá trị đầu vào

Một trong những trường hợp sử dụng phổ biến nhất của

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 là xây dựng những thuộc tính được quản lý để xác thực tài liệu đầu vào trước khi tàng trữ hoặc thậm chí đồng ý nó dưới dạng đầu vào bảo vệ an toàn và đáng tin cậy. Xác thực tài liệu là một yêu cầu phổ biến trong mã lấy đầu vào từ người tiêu dùng hoặc những nguồn thông tin khác mà bạn cho là không đáng tin cậy

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 của Python đáp ứng một công cụ nhanh gọn và đáng tin cậy để xử lý xác thực tài liệu đầu vào. Ví dụ: nghĩ lại ví dụ về >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 4, bạn hoàn toàn có thể yêu cầu những giá trị của # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 35 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 36 là những số hợp lệ. Vì người tiêu dùng của bạn được tự do nhập bất kỳ loại tài liệu nào, nên bạn cần đảm nói rằng điểm của bạn chỉ đồng ý số

Đây là một triển khai của

>>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 4 để quản lý yêu cầu này

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 20

Các phương thức setter của

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 35 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 36 sử dụng những khối xác thực tài liệu đầu vào bằng phương pháp sử dụng kiểu Python. Nếu cuộc gọi tới # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 266 thành công, thì tài liệu đầu vào hợp lệ và bạn nhận được # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 267 trên màn hình hiển thị của tớ. Nếu # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 266 tăng một # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 269, thì người tiêu dùng sẽ nhận được một # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 269 với một thông báo rõ ràng hơn

Ghi chú. Trong ví dụ trên, bạn sử dụng cú pháp

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 271 … # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 272 để ẩn những cụ ông cụ bà thể nội bộ liên quan đến ngữ cảnh mà bạn đang đưa ra ngoại lệ. Từ quan điểm của người tiêu dùng cuối, những rõ ràng này hoàn toàn có thể gây nhầm lẫn và làm cho lớp học của bạn trông không được trau chuốt

Kiểm tra phần trên tài liệu để biết thêm thông tin về chủ đề này

Điều quan trọng cần lưu ý là việc gán trực tiếp những thuộc tính

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 35 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 36 trong # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 413 đảm nói rằng việc xác thực cũng xảy ra trong quá trình khởi tạo đối tượng. Không làm như vậy là một lỗi phổ biến khi sử dụng # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 để xác thực tài liệu

Đây là cách lớp học

>>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 4 của bạn hiện giờ đang hoạt động và sinh hoạt giải trí

>>>

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 21

Nếu bạn chỉ định những giá trị

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 35 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 36 mà # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 266 hoàn toàn có thể trở thành số dấu phẩy động, thì quá trình xác thực thành công và giá trị được đồng ý. Nếu không, bạn nhận được một # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 269

Việc triển khai

>>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 4 này phát hiện ra điểm yếu cơ bản của # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4. Bạn có phát hiện ra nó không?

Đó là nó. Bạn có mã lặp đi lặp lại theo bộ sưu tập rõ ràng. Sự lặp lại này phá vỡ nguyên tắc DRY (Don't Repeat Yourself), vì vậy bạn sẽ muốn cấu trúc lại mã này để tránh nó. Để làm như vậy, bạn hoàn toàn có thể trừu tượng hóa logic lặp đi lặp lại bằng phương pháp sử dụng bộ mô tả

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 22

Bây giờ mã của bạn ngắn lại một chút ít. Bạn đã quản lý để xóa mã lặp lại bằng phương pháp xác định

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 285 làm bộ mô tả quản lý xác thực tài liệu của bạn ở một nơi duy nhất. Mã này hoạt động và sinh hoạt giải trí in như cách triển khai trước đó của bạn. Đi trước và đáp ứng cho nó một thử

Nói chung, nếu bạn thấy mình đang sao chép và dán những định nghĩa thuộc tính xung quanh mã của tớ hoặc nếu bạn phát hiện thấy mã lặp lại như trong ví dụ trên, thì bạn nên xem xét sử dụng một bộ mô tả phù hợp

Loại bỏ những quảng cáo

Cung cấp những thuộc tính được tính toán

Nếu bạn cần một thuộc tính hoàn toàn có thể xây dựng giá trị của nó một cách linh hoạt bất kể lúc nào bạn truy cập nó, thì

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 là cách tốt nhất. Những loại thuộc tính này thường được gọi là thuộc tính được tính toán. Chúng tiện dụng khi bạn cần chúng trông in như thuộc tính háo hức, nhưng bạn muốn chúng trở nên lười biếng

Lý do chính để tạo thuộc tính háo hức là để tối ưu hóa ngân sách tính toán khi bạn truy cập thuộc tính thường xuyên. Mặt khác, nếu bạn hiếm khi sử dụng một thuộc tính nhất định, thì thuộc tính lười biếng hoàn toàn có thể trì hoãn việc tính toán của nó cho tới lúc thiết yếu, điều này hoàn toàn có thể làm cho chương trình của bạn hiệu suất cao hơn

Dưới đây là ví dụ về cách sử dụng

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 để tạo thuộc tính được tính toán # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 288 trong lớp # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 289

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 23

Trong ví dụ này, trình khởi tạo

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 289 lấy # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 291 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 292 làm đối số và tàng trữ chúng trong những thuộc tính thể hiện thông thường. Thuộc tính chỉ đọc # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 288 tính toán và trả về diện tích s quy hoạnh của hình chữ nhật hiện tại mọi khi bạn truy cập nó

Một trường hợp sử dụng phổ biến khác của những thuộc tính là đáp ứng một giá trị được định dạng tự động cho một thuộc tính nhất định

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 24

Trong ví dụ này,

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 294 là thuộc tính định dạng và trả về giá của một sản phẩm rõ ràng. Để đáp ứng định dạng in như tiền tệ, bạn sử dụng chuỗi f với những tùy chọn định dạng phù hợp

Ghi chú. Ví dụ này sử dụng số dấu phẩy động để biểu thị tiền tệ, đây là cách làm không tốt. Thay vào đó, bạn nên sử dụng từ thư viện chuẩn

Như một ví dụ ở đầu cuối về những thuộc tính được tính toán, giả sử bạn có một lớp

>>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 4 sử dụng # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 35 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 36 làm tọa độ Descartes. Bạn muốn đáp ứng tọa độ cực cho điểm của tớ để bạn hoàn toàn có thể sử dụng chúng trong một số trong những tính toán. Hệ tọa độ cực biểu thị mỗi điểm bằng phương pháp sử dụng khoảng chừng cách đến gốc tọa độ và góc với trục tọa độ nằm ngang

Đây là một lớp

>>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 4 tọa độ Descartes cũng đáp ứng những tọa độ cực được tính toán

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 25

Ví dụ này đã cho tất cả chúng ta biết phương pháp tính toán khoảng chừng cách và góc của một đối tượng

>>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 4 đã cho bằng phương pháp sử dụng tọa độ Đề những của # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 35 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 36. Đây là cách mã này hoạt động và sinh hoạt giải trí trong thực tế

>>>

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 26

Khi nói đến việc đáp ứng những thuộc tính được tính toán hoặc lười biếng,

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 là một công cụ khá tiện dụng. Tuy nhiên, nếu bạn đang tạo một thuộc tính mà bạn sử dụng thường xuyên, thì việc tính toán thuộc tính đó mỗi lần hoàn toàn có thể tốn kém và tiêu tốn lãng phí. Một kế hoạch tốt là tàng trữ chúng sau khi tính toán xong

Bộ nhớ đệm thuộc tính được tính toán

Đôi khi bạn có một thuộc tính tính toán nhất định mà bạn sử dụng thường xuyên. Liên tục lặp lại cùng một phép tính hoàn toàn có thể không thiết yếu và tốn kém. Để khắc phục sự cố này, bạn hoàn toàn có thể lưu giá trị được tính vào bộ đệm ẩn và lưu nó vào một thuộc tính dành riêng không công khai minh bạch để sử dụng lại sau này

Để ngăn ngừa những hành vi không mong ước, bạn cần nghĩ đến kĩ năng thay đổi của tài liệu đầu vào. Nếu bạn có một thuộc tính tính toán giá trị của nó từ những giá trị đầu vào không đổi, thì kết quả sẽ không bao giờ thay đổi. Trong trường hợp đó, bạn hoàn toàn có thể tính toán giá trị chỉ một lần

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 27

Mặc dù việc triển khai

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6 này tàng trữ đúng chuẩn đường kính được tính toán, nhưng nó có nhược điểm là nếu bạn thay đổi giá trị của # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7, thì >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 0 sẽ không trả về giá trị đúng chuẩn

>>>

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 28

Trong những ví dụ này, bạn tạo một hình tròn trụ có bán kính bằng

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 607. Thuộc tính >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 0 chỉ tính toán giá trị của nó khi bạn truy cập lần đầu tiên. Đó là nguyên do tại sao bạn thấy độ trễ trong lần thực thi đầu tiên và không còn độ trễ trong lần thực thi thứ hai. Lưu ý rằng trong cả những lúc bạn thay đổi giá trị của bán kính, đường kính vẫn không thay đổi

Nếu tài liệu đầu vào cho một thuộc tính được tính toán bị thay đổi, thì bạn nên phải tính toán lại thuộc tính đó

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 29

Phương thức setter của thuộc tính

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7 đặt lại # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 610 thành # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 611 mọi khi bạn thay đổi giá trị của bán kính. Với bản update nhỏ này, >>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 0 sẽ tính toán lại giá trị của nó trong lần đầu tiên bạn truy cập nó sau mỗi lần thay đổi của # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7

>>>

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 60

Mát mẻ.

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6 hoạt động và sinh hoạt giải trí đúng chuẩn ngay giờ đây. Nó tính toán đường kính khi bạn truy cập lần đầu tiên và mọi khi bạn thay đổi bán kính

Một tùy chọn khác để tạo những thuộc tính được lưu trong bộ nhớ cache là sử dụng từ thư viện chuẩn. Chức năng này hoạt động và sinh hoạt giải trí như một công cụ trang trí được cho phép bạn quy đổi một phương thức thành một thuộc tính được lưu trong bộ nhớ cache. Thuộc tính chỉ tính toán giá trị của nó một lần và tàng trữ nó như một thuộc tính thông thường trong suốt thời gian tồn tại của thể hiện

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 61

Ở đây,

>>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 0 tính toán và tàng trữ giá trị của nó khi bạn truy cập lần đầu tiên. Kiểu triển khai này phù phù phù hợp với những tính toán trong đó những giá trị đầu vào không thay đổi. Đây là cách nó hoạt động và sinh hoạt giải trí

>>>

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 62

Khi bạn truy cập vào

>>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 0, bạn sẽ nhận được giá trị tính toán của nó. Giá trị đó vẫn không thay đổi từ thời điểm này trở đi. Tuy nhiên, không in như # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4, # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 619 không chặn những đột biến thuộc tính trừ khi bạn đáp ứng một phương thức setter phù hợp. Đó là nguyên do tại sao bạn hoàn toàn có thể update đường kính thành # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 620 trong vài dòng ở đầu cuối

Nếu bạn muốn tạo một thuộc tính được lưu trong bộ nhớ cache không được cho phép sửa đổi, thì bạn hoàn toàn có thể sử dụng

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 và như trong ví dụ sau

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 63

Mã này xếp

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 463 lên trên # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 624. Sự phối hợp của tất cả hai bộ trang trí sẽ tạo ra một thuộc tính được lưu trong bộ nhớ cache để ngăn ngừa những đột biến

>>>

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 64

Trong những ví dụ này, khi bạn nỗ lực gán một giá trị mới cho

>>> from circle import Circle >>> circle = Circle(42.0) >>> circle.radius Get radius 42.0 >>> circle.radius = 100.0 Set radius >>> circle.radius Get radius 100.0 >>> del circle.radius Delete radius >>> circle.radius Get radius Traceback (most recent call last): ... AttributeError: 'Circle' object has no attribute '_radius' >>> help(circle) Help on Circle in module __main__ object: class Circle(builtins.object) ... | radius | The radius property. 0, bạn sẽ nhận được một # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 453 vì hiệu suất cao setter đến từ bộ mô tả bên trong của # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 14

Loại bỏ những quảng cáo

Ghi nhật ký truy cập thuộc tính và đột biến

Đôi khi bạn cần theo dõi mã của tớ làm gì và chương trình của bạn chạy ra làm sao. Một phương pháp để làm điều đó trong Python là sử dụng

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 628. Mô-đun này đáp ứng tất cả những hiệu suất cao bạn cần để ghi nhật ký mã của tớ. Nó sẽ được cho phép bạn liên tục xem mã và tạo thông tin hữu ích về phương pháp hoạt động và sinh hoạt giải trí của nó

Nếu bạn cần theo dõi phương pháp và thời điểm bạn truy cập và thay đổi một thuộc tính nhất định, thì bạn cũng hoàn toàn có thể tận dụng lợi thế của

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 cho việc đó

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 65

Tại đây, trước tiên bạn nhập

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 628 và xác định thông số kỹ thuật cơ bản. Sau đó, bạn triển khai # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6 với thuộc tính được quản lý # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7. Phương thức getter tạo thông tin nhật ký mọi khi bạn truy cập # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7 trong mã của tớ. Phương thức setter ghi lại từng đột biến mà bạn thực hiện trên # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 7. Nó cũng ghi lại những tình huống mà bạn gặp lỗi do tài liệu đầu vào không hợp lệ

Đây là cách bạn hoàn toàn có thể sử dụng

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 6 trong mã của tớ

>>>

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 66

Ghi nhật ký tài liệu hữu ích từ truy cập thuộc tính và biến hóa hoàn toàn có thể giúp bạn gỡ lỗi mã của tớ. Ghi nhật ký cũng hoàn toàn có thể giúp bạn xác định những nguồn đầu vào tài liệu có vấn đề, phân tích hiệu suất mã của bạn, phát hiện những kiểu sử dụng, v.v.

Quản lý xóa thuộc tính

Bạn cũng hoàn toàn có thể tạo những thuộc tính thực hiện hiệu suất cao xóa. Đây hoàn toàn có thể là trường hợp hiếm khi sử dụng của

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4, nhưng có một phương pháp để xóa một thuộc tính hoàn toàn có thể hữu ích trong một số trong những trường hợp

Giả sử bạn đang triển khai kiểu tài liệu cây của riêng mình. Cây là một kiểu tài liệu trừu tượng tàng trữ những phần tử trong một khối mạng lưới hệ thống phân cấp. Các thành phần cây thường được gọi là những nút. Mỗi nút trong cây có một nút cha, ngoại trừ nút gốc. Các nút hoàn toàn có thể có 0 hoặc nhiều nút con

Bây giờ, giả sử bạn cần đáp ứng cách xóa hoặc xóa list con của một nút nhất định. Đây là một ví dụ triển khai nút cây sử dụng

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 để đáp ứng hầu hết những hiệu suất cao của nó, gồm hoàn toàn có thể xóa list nút con của nút hiện tại

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 67

Trong ví dụ này,

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 638 đại diện cho một nút trong kiểu tài liệu cây tùy chỉnh của bạn. Mỗi nút lưu những nút con của nó trong list Python. Sau đó, bạn triển khai # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 639 làm thuộc tính để quản lý list con cơ bản. Phương thức deleter gọi # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 640 trong list con để vô hiệu tất cả

>>>

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 68

Tại đây, trước tiên bạn tạo một nút

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 641 để khởi đầu điền vào cây. Sau đó, bạn tạo hai nút mới và gán chúng cho # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 639 bằng list. Câu lệnh kích hoạt phương thức xóa nội bộ của # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 639 và xóa list

Tạo API lớp tương thích ngược

Như bạn đã biết, thuộc tính biến lời gọi phương thức thành tra cứu thuộc tính trực tiếp. Tính năng này được cho phép bạn tạo API sạch và Pythonic cho những lớp học của tớ. Bạn hoàn toàn có thể hiển thị công khai minh bạch những thuộc tính của tớ mà không còn nhu yếu các phương thức getter và setter

Nếu bạn cần sửa đổi cách bạn tính toán một thuộc tính công khai minh bạch đã cho, thì bạn hoàn toàn có thể biến nó thành một thuộc tính. Các thuộc tính giúp hoàn toàn có thể thực hiện xử lý tương hỗ update, ví dụ như xác thực tài liệu mà không phải sửa đổi những API công khai minh bạch của bạn

Giả sử bạn đang tạo một ứng dụng kế toán và bạn cần một lớp cơ sở để quản lý tiền tệ. Cuối cùng, bạn tạo một lớp

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 645 hiển thị hai thuộc tính, # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 646 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 647

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 69

Lớp này trông sạch sẽ và Pythonic. Bây giờ giả sử rằng yêu cầu của bạn thay đổi và bạn quyết định tàng trữ tổng số xu thay vì đơn vị và xu. Việc xóa

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 646 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 647 khỏi API công khai minh bạch của bạn để sử dụng thứ gì đó như # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 650 sẽ phá vỡ nhiều mã của một người tiêu dùng

Trong tình huống này,

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 hoàn toàn có thể là một lựa chọn tuyệt vời để không thay đổi API hiện tại của bạn. Đây là cách bạn hoàn toàn có thể xử lý và xử lý vấn đề và tránh vi phạm mã của người tiêu dùng

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 0

Giờ đây, lớp của bạn tàng trữ tổng số xu thay vì những đơn vị và xu độc lập. Tuy nhiên, người tiêu dùng của bạn vẫn hoàn toàn có thể truy cập và thay đổi

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 646 và # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 647 trong mã của tớ và nhận được kết quả tương tự như trước đây. Đi trước và đáp ứng cho nó một thử

Khi bạn viết thứ gì đó mà nhiều người sẽ xây dựng nhờ vào đó, bạn cần đảm nói rằng những sửa đổi đối với triển khai nội bộ không ảnh hưởng đến cách người tiêu dùng cuối thao tác với những lớp của bạn

Loại bỏ những quảng cáo

Thuộc tính ghi đè trong những lớp con

Khi bạn tạo những lớp Python gồm có những thuộc tính và phát hành chúng trong một gói hoặc thư viện, bạn nên mong đợi người tiêu dùng của tớ thực hiện nhiều việc rất khác nhau với chúng. Một trong những điều đó hoàn toàn có thể là phân lớp chúng để tùy chỉnh những hiệu suất cao của chúng. Trong những trường hợp này, người tiêu dùng của bạn phải thận trọng và nhận thức được một tín hiệu cố ý tinh vi. Nếu bạn ghi đè một phần thuộc tính thì bạn sẽ mất hiệu suất cao không ghi đè

Ví dụ: giả sử bạn đang viết mã lớp

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 654 để quản lý thông tin nhân viên cấp dưới trong khối mạng lưới hệ thống kế toán nội bộ của công ty bạn. Bạn đã có một lớp tên là # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 655 và bạn nghĩ về việc phân lớp nó để sử dụng lại những hiệu suất cao của nó

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 655 có thuộc tính # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 238 được triển khai dưới dạng thuộc tính. Việc triển khai hiện tại của # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 238 không đáp ứng yêu cầu trả lại tên bằng chữ in hoa. Đây là cách bạn xử lý và xử lý vấn đề này

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 1

Trong

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 654, bạn ghi đè lên # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 238 để đảm nói rằng khi bạn truy cập thuộc tính, bạn sẽ nhận được tên nhân viên cấp dưới viết hoa

>>>

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 2

Tuyệt quá.

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 654 hoạt động và sinh hoạt giải trí như bạn cần. Nó trả về tên bằng chữ in hoa. Tuy nhiên, những thử nghiệm tiếp theo phát hiện ra một hành vi không mong ước

>>>

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 3

Chuyện gì đã xảy ra thế? . Trong ví dụ này, bạn chỉ triển khai lại phương thức getter. Do đó,

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 238 đã mất phần còn sót lại của hiệu suất cao từ lớp cơ sở. Bạn không hề phương thức setter nữa

Ý tưởng là nếu bạn cần ghi đè một thuộc tính trong một lớp con, thì bạn nên đáp ứng tất cả những hiệu suất cao bạn cần trong phiên bản mới của thuộc tính đó.

Phần kết luận

Thuộc tính là một loại thành viên lớp đặc biệt đáp ứng hiệu suất cao ở đâu đó Một trong những thuộc tính và phương thức thông thường. Các thuộc tính được cho phép bạn sửa đổi việc triển khai những thuộc tính thành viên mà không thay đổi API công khai minh bạch của lớp. Khả năng không thay đổi những API của bạn giúp bạn tránh vi phạm mã mà người tiêu dùng của bạn đã viết trên những phiên bản cũ hơn của lớp học của bạn

Các thuộc tính là cách Pythonic để tạo những thuộc tính được quản lý trong những lớp của bạn. Chúng có một số trong những trường hợp sử dụng trong lập trình trong thế giới thực, khiến chúng trở thành sự tương hỗ update tuyệt vời cho bộ kỹ năng của bạn với tư cách là nhà phát triển Python

Trong hướng dẫn này, bạn đã học cách

    Tạo những thuộc tính được quản lý với # circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4 của PythonThực hiện đánh giá thuộc tính lười biếng và đáp ứng những thuộc tính được tính toánTránh những phương thức setter và getter có thuộc tínhTạo những thuộc tính chỉ đọc, chỉ đọc và ghiTạo những API nhất quán và tương thích ngược cho những lớp của bạn

Bạn đã và đang viết một số trong những ví dụ thực tế hướng dẫn bạn về những trường hợp sử dụng phổ biến nhất của

# circle.py class Circle: def __init__(self, radius): self._radius = radius def _get_radius(self): print("Get radius") return self._radius def _set_radius(self, value): print("Set radius") self._radius = value def _del_radius(self): print("Delete radius") del self._radius radius = property( fget=_get_radius, fset=_set_radius, fdel=_del_radius, doc="The radius property." ) 4. Những ví dụ đó gồm có đầu vào, thuộc tính được tính toán, ghi nhật ký mã của bạn, v.v.

Đánh dấu là đã hoàn thành xong

Xem ngay Hướng dẫn này còn có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Quản lý thuộc tính với thuộc tính của Python()

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và mê hoặc được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất thần. Được quản lý bởi nhóm Real Python

Khi nào tôi nên sử dụng python trang trí thuộc tính?

Gửi cho tôi thủ thuật Python »

Giới thiệu về Leodanis Pozo Ramos

Khi nào tôi nên sử dụng python trang trí thuộc tính?Khi nào tôi nên sử dụng python trang trí thuộc tính?

Leodanis là một kỹ sư công nghiệp yêu thích Python và phát triển phần mềm. Anh ấy là một nhà phát triển Python tự học với hơn 6 năm kinh nghiệm tay nghề. Anh ấy là một nhà văn đam mê kỹ thuật với số lượng bài báo được xuất bản ngày càng tăng trên Real Python và những trang web khác

» Tìm hiểu thêm về Leodanis

Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm những nhà phát triển để nó đáp ứng những tiêu chuẩn rất chất lượng của chúng tôi. Các thành viên trong nhóm đã thao tác trong hướng dẫn này là

Khi nào tôi nên sử dụng python trang trí thuộc tính?

Aldren

Khi nào tôi nên sử dụng python trang trí thuộc tính?

Bartosz

Khi nào tôi nên sử dụng python trang trí thuộc tính?

Martin

Khi nào tôi nên sử dụng python trang trí thuộc tính?

Sadie

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không số lượng giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và hiệp hội những Pythonistas Chuyên Viên

Nâng cao kỹ năng Python của bạn »

Bậc thầy Kỹ năng Python trong thế giới thực
Với quyền truy cập không số lượng giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào Hàng trăm hướng dẫn, khóa học video thực hành và hiệp hội Pythonistas Chuyên Viên

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá nội dung bài viết này

Tweet Chia sẻ Chia sẻ E-Mail

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo phản hồi. Những nhận xét hữu ích nhất là những nhận xét được viết với mục tiêu học hỏi hoặc giúp sức những sinh viên khác. và nhận câu vấn đáp cho những thắc mắc phổ biến trong cổng thông tin tương hỗ của chúng tôi

Khi nào bạn nên sử dụng trình trang trí Python?

Bạn sẽ sử dụng trình trang trí khi bạn cần thay đổi hành vi của một hàm mà không cần sửa đổi chính hàm đó . Một vài ví dụ điển hình là lúc bạn muốn thêm ghi nhật ký, kiểm tra hiệu suất, thực hiện lưu vào bộ nhớ đệm, xác minh quyền, v.v. Bạn cũng hoàn toàn có thể sử dụng một mã khi cần chạy cùng một mã trên nhiều hiệu suất cao.

Trình trang trí thuộc tính trong Python là gì?

@property decorator là một công cụ trang trí tích hợp sẵn trong Python, hữu ích trong việc xác định những thuộc tính một cách thuận tiện và đơn giản mà không cần gọi thủ công hàm sẵn có property(). Which is used to return the property attributes of a class from the stated getter, setter and deleter as parameters.

quyền lợi của việc sử dụng trong trang trí là gì?

Trình trang trí hoàn toàn có thể cực kỳ hữu ích vì chúng được cho phép mở rộng hiệu suất cao hiện có mà không cần sửa đổi mã nguồn gốc của hiệu suất cao .

Ý nghĩa của @property trong Python là gì?

Người trang trí @property . Cú pháp của hàm này là. thuộc tính(fget=Không, fset=Không, fdel=Không, doc=Không)a built-in function that creates and returns a property object. The syntax of this function is: property(fget=None, fset=None, fdel=None, doc=None)Tải thêm tài liệu liên quan đến nội dung bài viết Khi nào tôi nên sử dụng python trang trí thuộc tính? programming python

Review Khi nào tôi nên sử dụng python trang trí thuộc tính? ?

Bạn vừa Read nội dung bài viết Với Một số hướng dẫn một cách rõ ràng hơn về Review Khi nào tôi nên sử dụng python trang trí thuộc tính? tiên tiến nhất

Share Link Cập nhật Khi nào tôi nên sử dụng python trang trí thuộc tính? miễn phí

Bạn đang tìm một số trong những ShareLink Tải Khi nào tôi nên sử dụng python trang trí thuộc tính? miễn phí.

Hỏi đáp thắc mắc về Khi nào tôi nên sử dụng python trang trí thuộc tính?

Nếu sau khi đọc nội dung bài viết Khi nào tôi nên sử dụng python trang trí thuộc tính? vẫn chưa hiểu thì hoàn toàn có thể lại Comments ở cuối bài để Tác giả lý giải và hướng dẫn lại nha #Khi #nào #tôi #nên #sử #dụng #python #trang #trí #thuộc #tính