Menu
CoddyTech

Декораторы свойств

Часть раздела Объектно-ориентированное программирование путешествия по Python на Coddy. Урок 14 из 64.

Декораторы свойств позволяют контролировать доступ к атрибутам и их изменение, сохраняя при этом простой синтаксис атрибутов.

Вот пример класса с геттером свойства:

class Person:
    def __init__(self, name, age):
        self._name = name
        self._age = age
    
    @property
    def age(self):
        return self._age

Используй свойство как обычный атрибут:

person = Person("Alice", 30)
print(person.age)

Вывод:

30

Обрати внимание: ты обращаешься к age без скобок, хотя на самом деле вызываешь метод.

Добавь сеттер для проверки данных при установке значений:

class Person:
    def __init__(self, name, age):
        self._name = name
        self._age = age
    
    @property
    def age(self):
        return self._age
    
    @age.setter
    def age(self, value):
        if value < 0:
            raise ValueError("Age cannot be negative")
        self._age = value

Теперь можно задать возраст с автоматической проверкой:

person = Person("Alice", 30)
person.age = 31     # Использует сеттер с проверкой
print(person.age)   # Использует геттер

# Это вызвало бы ошибку:
# person.age = -5   # ValueError: возраст не может быть отрицательным

Вывод:

31

Создай вычисляемые свойства, которые вычисляют значения:

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    @property
    def area(self):
        return self.width * self.height

rect = Rectangle(5, 3)
print(rect.area)  # Вычисляет 5 * 3 = 15

Вывод:

15

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

challenge icon

Задание

Средне

Завершите класс Temperature в temperature.py, который выполняет преобразование между градусами Цельсия и Фаренгейта. Затем используйте этот класс в driver.py, чтобы проверить преобразование температур. Следуйте комментариям TODO в обоих файлах, чтобы выполнить инструкции шаг за шагом.

Выведите каждое преобразование в формате [celsius]°C is [fahrenheit]°F, указав значение в градусах Цельсия точно таким, каким оно было задано, а значение в градусах Фаренгейта — таким, каким его вычисляет Python. Не округляйте числа и не задавайте им формат. Две строки, которые выводит драйвер:

25°C is 77.0°F
37.0°C is 98.6°F

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

# TODO: Импортируйте класс Temperature из модуля temperature

# Проверьте класс:
# TODO: Создайте экземпляр температуры со значением 25°C
temp = None  # Замените реальным экземпляром Temperature

# TODO: Выведите значения в градусах Цельсия и Фаренгейта
# TODO: Используйте формат: "25°C is 77.0°F" (выведите оба значения как есть, без округления и форматирования)

# TODO: Установите температуру на 98.6°F

# TODO: Выведите оба значения ещё раз, чтобы убедиться, что преобразование работает
# TODO: Используйте тот же формат, что и раньше
quiz iconПроверьте себя

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

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Python