Menu
Coddy logo textTech

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

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

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

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

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

Используйте property как обычный attribute:

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

Вывод:

30

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

Добавьте setter, чтобы проверять данные при установке values:

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

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

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 для getter и @attribute_name.setter для setter. Это позволяет выполнять проверку данных и вычислять значения, сохраняя простой синтаксис доступа к атрибутам.

challenge icon

Задание

Средне

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

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

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

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

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

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

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

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

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

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

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

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