Menu
Coddy logo textTech

Декоратор property

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

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

Вот пример класса, использующего @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

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

my_circle = Circle(5)

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

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

Вывод:

5
78.53975

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

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

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!")

Теперь вы можете устанавливать радиус как атрибут:

my_circle = Circle(5)
my_circle.radius = 10  # Использует сеттер
print(my_circle.radius)  # Использует геттер

Вывод:

10

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

Шпаргалка

Декоратор @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

Обращение к свойствам без круглых скобок:

my_circle = Circle(5)
print(my_circle.radius)  # 5
print(my_circle.area)    # 78.53975

Добавьте сеттер (setter) для управления присваиванием значений:

@radius.setter
def radius(self, value):
    if value > 0:
        self._radius = value
    else:
        print("Radius must be positive!")

Устанавливайте значения как атрибуты:

my_circle.radius = 10  # Использует сеттер
print(my_circle.radius)  # Использует геттер

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

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

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

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

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