@property
в Python используется для преобразования метода класса в свойство. Это позволяет получать значение атрибута класса, вызывая его как обычный атрибут (без скобок), при этом логика получения значения может быть реализована в методе.
class Circle: def __init__(self, radius): self._radius = radius @property def radius(self): return self._radius @property def area(self): return 3.14159 * self._radius ** 2 circle = Circle(5) print(circle.radius) # Выведет: 5 print(circle.area) # Выведет: 78.53975Здесь
radius
и area
являются свойствами. @property
для radius
позволяет просто вернуть значение, а для area
вычисляет площадь круга. Обратите внимание, что для radius
также можно определить setter и deleter для контроля над изменением и удалением этого свойства.
Метод @property
в Python - это декоратор, который позволяет превратить метод класса в атрибут (свойство). Это позволяет обращаться к методу как к обычной переменной, без необходимости явного вызова с использованием скобок ()
.
Основное назначение @property
- инкапсуляция логики доступа к атрибутам. Он позволяет контролировать чтение, изменение и удаление атрибутов класса, предоставляя при этом простой и интуитивно понятный синтаксис для пользователя класса.
Как использовать @property
:
@property
. Это определяет поведение при чтении значения свойства.
@имя_свойства.setter
. Этот метод принимает один аргумент (обычно value
), который представляет значение, которое нужно присвоить свойству. Он определяет поведение при записи значения свойства. Если сеттер не определен, свойство становится доступным только для чтения (read-only).
@имя_свойства.deleter
. Этот метод определяет поведение при удалении свойства с использованием del
. Если делитер не определен, удаление свойства невозможно.
Пример:
class Circle:
def __init__(self, radius):
self._radius = radius # Используем соглашение об именовании для "защищенных" атрибутов
@property
def radius(self):
"""Возвращает радиус круга."""
return self._radius
@radius.setter
def radius(self, value):
"""Устанавливает радиус круга, проверяя допустимость значения."""
if value <= 0:
raise ValueError("Радиус должен быть положительным.")
self._radius = value
@property
def area(self):
"""Вычисляет и возвращает площадь круга (только для чтения)."""
return 3.14159 * self._radius ** 2
@radius.deleter
def radius(self):
"""Удаляет радиус круга."""
print("Удаление радиуса")
del self._radius
# Использование
circle = Circle(5)
print(circle.radius) # Вывод: 5 (обращение к атрибуту radius через геттер)
circle.radius = 10
print(circle.radius) # Вывод: 10 (обращение к атрибуту radius через сеттер)
print(circle.area) # Вывод: 314.159 (обращение к атрибуту area, который является вычисляемым свойством)
del circle.radius # Вывод: Удаление радиуса (обращение к делитеру)
try:
print(circle.radius)
except AttributeError:
print("Радиуса больше не существует")
Преимущества использования @property
:
area
.