Menu
Coddy logo textTech

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

Часть раздела Object Oriented Programming путешествия по 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: Age cannot be negative

Вывод:

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 в обоих файлах для получения пошаговых инструкций.

Шпаргалка

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

Используйте @property для методов-геттеров:

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)  # Доступ как к атрибуту, без скобок

Используйте @attribute_name.setter для методов-сеттеров с валидацией:

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  # Использует сеттер с валидацией

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

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

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

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

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

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

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

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

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

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