Menu
Coddy logo textTech

Decoradores de propiedades

Parte de la sección Object Oriented Programming del Journey de Python de Coddy — lección 14 de 64.

Los decoradores de propiedades te permiten controlar cómo se accede a los atributos y cómo se modifican, manteniendo al mismo tiempo la sintaxis simple de los atributos.

Aquí hay un ejemplo de una clase con un getter de propiedad:

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

Usa la propiedad como un atributo normal:

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

Resultado:

30

Observa que accedes a age sin paréntesis, aunque en realidad está llamando a un método.

Añade un setter para validar los datos al establecer valores:

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

Ahora puedes establecer la edad con validación automática:

person = Person("Alice", 30)
person.age = 31     # Usa el setter con validación
print(person.age)   # Usa el getter

# Esto lanzaría un error:
# person.age = -5   # ValueError: La edad no puede ser negativa

Salida:

31

Crea propiedades computadas que calculen valores:

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)  # Calcula 5 * 3 = 15

Resultado:

15

Punto clave: Los decoradores de propiedades hacen que los métodos parezcan atributos. Usa @property para los getters y @attribute_name.setter para los setters. Esto permite la validación de datos y valores calculados mientras se mantiene una sintaxis simple de acceso a atributos.

challenge icon

Desafío

Intermedio

Completa la clase Temperature en temperature.py que convierte entre Celsius y Fahrenheit. Luego, utiliza esta clase en driver.py para probar las conversiones de temperatura. Sigue los comentarios TODO en ambos archivos para obtener instrucciones paso a paso.

Hoja de referencia

Los decoradores de propiedades le permiten controlar cómo se accede y se modifican los atributos manteniendo una sintaxis de atributos sencilla.

Use @property para los métodos getter:

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)  # Acceso como un atributo, sin paréntesis

Use @attribute_name.setter para los métodos setter con validación:

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  # Utiliza el setter con validación

Cree propiedades calculadas que calculen valores:

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)  # Calcula 5 * 3 = 15

Pruébalo tú mismo

# TODO: Importar la clase Temperature del módulo temperature

# Probar la clase:
# TODO: Crear una instancia de temperatura a 25°C
temp = None  # Reemplazar con la instancia real de Temperature

# TODO: Imprimir los valores tanto en Celsius como en Fahrenheit
# TODO: Usar el formato: "25.0°C is 77.0°F"

# TODO: Establecer la temperatura a 98.6°F

# TODO: Imprimir ambos valores de nuevo para confirmar que la conversión funciona
# TODO: Usar el mismo formato que antes
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Object Oriented Programming