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._ageUsa la propiedad como un atributo normal:
person = Person("Alice", 30)
print(person.age)Resultado:
30Observa 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 = valueAhora 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 negativaSalida:
31Crea 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 = 15Resultado:
15Punto 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.
Desafío
IntermedioCompleta 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éntesisUse @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ónCree 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 = 15Prué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 antesEsta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Object Oriented Programming
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases vs ObjetosEl parámetro selfMétodosAtributosMétodo constructor (__init__)Resumen - Calculadora simple4Herencia
Herencia básicaLa función super()Sobrescritura de métodosHerencia múltipleOrden de resolución de métodosResumen - Jerarquía de empleados7Métodos especiales
Introducción a los métodos mágicosSobrecarga de operadoresMétodos mágicos de contenedoresRepaso - Lista personalizada10Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy2Decoradores
Introducción a los decoradoresDecorador propertyDecorador de métodos estáticosDecorador de métodos de clase5Polimorfismo
Sobreescritura de métodos revisitadaDuck TypingClases y métodos abstractosDiseño de interfacesResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaMixinsMétodos estáticos y de claseDecoradores de claseGestores de contexto11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Propiedades de clase
Variables de instancia vs de claseDecoradores de propiedadesAtributos privadosResumen - Gestor de cuentas bancarias