Menu
Coddy logo textTech

Декоратор property

Часть раздела Object Oriented Programming путешествия по Python на Coddy — урок 10 из 64.

Декоратор @property позволяет обращаться к методам как к атрибутам, обеспечивая удобный способ получения и установки значений. Это полезно для инкапсуляции, позволяя добавлять логику валидации или вычисляемые значения без изменения публичного интерфейса вашего class.

Вот пример класса с использованием @property:

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

Обратите внимание, что мы используем self._radius для хранения фактического значения. Если бы мы использовали self.radius внутри getter, это снова вызвало бы метод getter, что привело бы к бесконечной рекурсии.

Создайте круг и получите доступ к свойствам:

my_circle = Circle(5)

Обращайтесь к свойствам как к обычным атрибутам:

print(my_circle.radius)
print(my_circle.area)

Вывод:

5
78.53975

Обратите внимание, что вы не используете скобки () при обращении к свойствам — они выглядят как атрибуты, но выполняют код метода.

Добавьте setter, чтобы разрешить изменение значений с валидацией:

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:
            self._radius = value
        else:
            print("Radius must be positive!")

Теперь вы можете задать radius как атрибут:

my_circle = Circle(5)
my_circle.radius = 10  # Uses the setter
print(my_circle.radius)  # Uses the getter

Вывод:

10

Ключевой момент: @property позволяет методам выглядеть как атрибуты, в то время как @property_name.setter позволяет контролировать то, как присваиваются значения, обеспечивая валидацию данных и инкапсуляцию.

Попробуйте сами

В этом уроке нет задания по программированию.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Object Oriented Programming