Fundamentos de Programación y Python

1

¿Por qué aprender Python?

2

Introducción a Python

3

Conceptos Básicos de Programación

4

Práctica: Te doy la bienvenida a los ejercicios interactivos

5

Manipulación de Cadenas de Texto en Python

6

Enteros, Flotantes y Booleanos

7

Todo lo que Debes Saber sobre print en Python

8

Operaciones Matemáticas en Python

9

Operaciones de Entrada/Salida en Consola

Colección y Procesamiento de Datos en Python

10

Listas

11

Método slice

12

Listas de más dimensiones y Tuplas

13

Aplicación de Matrices

14

Diccionarios

15

Comprehension Lists en Python (CLASE NUEVA)

Control de Flujo en Python

16

Estructuras condicionales

17

Bucles y Control de Iteraciones

18

Generadores e Iteradores

Funciones y Manejo de Excepciones en Python

19

Uso de Funciones en Python

20

Funciones Lambda y Programación Funcional en Python

21

¿Cómo realizar una función recursiva en Python?

22

Manejo de Excepciones y Uso de Pass (CLASE NUEVA)

Programación Orientada a Objetos en Python

23

Fundamentos de Programación Orientada a Objetos en Python

24

Ejercicio Biblioteca con POO

25

Herencia en POO con Python

26

Objetos heredados

27

Los 4 pilares de la programacion orientada a objetos

28

Uso de super() en Python (CLASE NUEVA)

29

Superando los Fundamentos de Programación Orientada a Objetos en Python

Lectura y escritura de archivos

30

Manejo de Archivos .TXT (CLASE NUEVA)

31

Manejo de Archivos CSV (CLASE NUEVA)

32

Manejo de Archivos JSON (CLASE NUEVA)

Biblioteca estándar de Python

33

Biblioteca estándar en Python (CLASE NUEVA)

34

Librería Os, Math y Random (CLASE NUEVA)

35

Librería Statistics y Análisis Estadístico (CLASE NUEVA)

36

Proyecto final: Guerra naval

Conceptos avanzados de Python

37

Recapitulación de lo aprendido hasta ahora

38

Escribir código Pythonico y profesional

39

Comentarios y Docstrings en Python

40

Scope y closures: variables locales y globales

41

Anotaciones de tipo

42

Validación de tipos en métodos

43

Librería Collections y Enumeraciones

Decoradores

44

Decoradores en Python

45

Decoradores anidados y con parámetros

46

Uso de Decoradores en clases y métodos

Métodos y estructura de clases en Python

47

Métodos mágicos

48

Sobrecarga de operadores

49

Implementación de `if __name__ == "__main__":`

50

Metaprogramación en Python

51

Uso de *args y **kwargs

52

Métodos privados y protegidos

53

Gestión avanzada de propiedades

54

Métodos estáticos y de clase avanzados

Programación concurrente y asíncrona

55

Introducción a la concurrencia y paralelismo

56

Threading y multiprocessing en Python

57

Asincronismo con asyncio

58

Asincronismo y concurrencia

Creación de módulos y paquetes

59

Creación de módulos en Python

60

Gestión de paquetes

61

Publicación de paquetes en PyPI

Proyecto final

62

Implementación de un sistema completo

63

Implementación de un Sistema Completo

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

12 Días
11 Hrs
39 Min
27 Seg
Curso de Python

Curso de Python

Carli Code

Carli Code

Uso de Decoradores en clases y métodos

46/63
Recursos

Aportes 5

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

En Python, los decoradores no solo se usan en funciones, también se pueden aplicar a clases y métodos para extender o modificar su comportamiento. Los decoradores en clases y métodos son especialmente útiles para aspectos transversales como la validación de permisos, el registro de accesos, el manejo de excepciones y la administración de cachés. Aquí tienes una guía rápida sobre cómo funcionan y un ejemplo detallado: \### Decoradores en Métodos de Clase Los decoradores pueden aplicarse a métodos específicos de una clase, y se comportan según el tipo de método: \- \*\*Métodos de instancia\*\* (los métodos normales que acceden a `self`). \- \*\*Métodos de clase\*\* (aquellos que usan `@classmethod` y acceden a `cls`). \- \*\*Métodos estáticos\*\* (usando `@staticmethod`, no acceden ni a `self` ni a `cls`). Los decoradores en métodos de clase pueden hacer cosas como: 1\. Controlar permisos antes de ejecutar el método. 2\. Hacer un registro (logging) cada vez que se llama al método. 3\. Manejar errores de forma consistente. \### Decoradores en Clases Un decorador en una clase modifica el comportamiento de la clase en su conjunto, normalmente para extenderla o agregarle nuevas funcionalidades. \### Ejemplo de Uso Imaginemos una clase `CuentaBancaria` donde queremos aplicar un decorador para registrar cada vez que se realiza una operación, y otro decorador para comprobar permisos de acceso a ciertas operaciones. ```python from functools import wraps import datetime \# Decorador para verificar permisos def verificar\_permisos(permiso\_necesario): def decorador\_metodo(func): @wraps(func) def envoltura(self, \*args, \*\*kwargs): if permiso\_necesario not in self.permisos: raise PermissionError(f"No tienes permisos para realizar esta operación: {permiso\_necesario}") return func(self, \*args, \*\*kwargs) return envoltura return decorador\_metodo \# Decorador para registrar en log def registrar\_operacion(func): @wraps(func) def envoltura(self, \*args, \*\*kwargs): resultado = func(self, \*args, \*\*kwargs) operacion = f"{func.\_\_name\_\_} ejecutado el {datetime.datetime.now()}" self.historial.append(operacion) print(f"Registro: {operacion}") return resultado return envoltura \# Clase CuentaBancaria usando decoradores en sus métodos class CuentaBancaria: def \_\_init\_\_(self, balance=0): self.balance = balance self.historial = \[] self.permisos = \['ver\_balance', 'retirar'] # permisos actuales del usuario @registrar\_operacion @verificar\_permisos('ver\_balance') def ver\_balance(self): print(f"Balance actual: ${self.balance}") return self.balance @registrar\_operacion @verificar\_permisos('retirar') def retirar(self, cantidad): if cantidad > self.balance: raise ValueError("Fondos insuficientes") self.balance -= cantidad print(f"Retiro exitoso: ${cantidad}. Nuevo balance: ${self.balance}") return self.balance \# Uso de la clase con decoradores cuenta = CuentaBancaria(1000) \# Operaciones cuenta.ver\_balance() cuenta.retirar(200) \# Intento de retiro sin permisos try: cuenta.permisos.remove('retirar') cuenta.retirar(100) except PermissionError as e: print(e) ``` \### Explicación 1\. \*\*`@verificar\_permisos`\*\*: Este decorador toma un parámetro, `permiso\_necesario`, y se asegura de que el usuario tenga el permiso adecuado antes de ejecutar el método. 2\. \*\*`@registrar\_operacion`\*\*: Este decorador registra cada operación realizada, almacenándola en el atributo `historial`. Este patrón es muy poderoso para clases que requieren varias verificaciones y registros en sus métodos, proporcionando una estructura de código limpia y modular.
alguien tiene informacion de los decoradores? no he entendido nada, como funcionan?
En Python, `property` y `setter` son decoradores que permiten gestionar el acceso a los atributos de una clase de forma controlada. - **`property`**: Este decorador permite acceder a un método como si fuera un atributo. Por ejemplo, si tenemos un método que calcula el área de un círculo, al usar `property`, podemos acceder a este método sin paréntesis, como si fuera un atributo. - **`setter`**: Se usa para definir un método que permite modificar el valor de un atributo de forma segura. Por ejemplo, puedes validar que el nuevo valor no sea negativo antes de asignarlo a un atributo. Estos decoradores ayudan a encapsular la lógica de la clase y proporcionan un control más estricto sobre cómo se accede y modifica la información.
Los **decoradores** en programación son herramientas que permiten modificar o extender el comportamiento de funciones, métodos o clases sin cambiar directamente su código. Son muy utilizados en lenguajes como **Python**, donde se implementan como funciones o clases que actúan sobre otras funciones o clases. ### ¿Cómo funcionan los decoradores? Un decorador es una función que toma otra función o clase como entrada, realiza alguna acción (como añadir funcionalidades) y devuelve una nueva función o clase con el comportamiento modificado. ### Ejemplo sencillo en Python ```python def decorador(func): def nueva_funcion(): print("Antes de ejecutar la función original") func() print("Después de ejecutar la función original") return nueva_funcion @decorador def saludo(): print("Hola, mundo!") saludo() ```Salida: Antes de ejecutar la función original Hola, mundo! Después de ejecutar la función original. El decorador `decorador` modifica el comportamiento de la función `saludo`, añadiendo código antes y después de su ejecución.
```js # Decorator with class using static method # it means that the method is not dependent on the instance of the class class Calculator: @staticmethod def add( a, b): """ sum of two numbers """ return a + b # Decorator with class using class method # it means that the method is dependent on the class and not on the instance of the class Counter: """ Counter class """ count = 0 @classmethod def increment(cls): """ increment count """ cls.count += 1 # Counter.increment() # Counter.increment() # print(Counter.count) # Decorator with class using property # it means that the method is dependent on the instance of the class class Circle: """ Circle class """ def __init__(self, radius: float): self._radius = radius @property def area(self): """ calculate area of circle """ return 3.1416 * (self._radius ** 2) @property def radius(self): """ get radius """ return self._radius @radius.setter def radius(self, value): """ set radius """ if value < 0: raise ValueError("Radius cannot be negative") self._radius = value circle = Circle(5) print(circle.area) circle.radius = 10 print(circle.area) del circle.radius print(circle.area) ```""" This module is an example of using decorators with class """ *# Decorator with class using static method# it means that the method is not dependent on the instance of the class*class *Calculator*: @*staticmethod* def *add*( *a*, *b*): """ sum of two numbers """ return *a* + *b* *# Decorator with class using class method# it means that the method is dependent on the class and not on the instance of the*class *Counter*: """ Counter class """ count = 0 @*classmethod* def *increment*(*cls*): """ increment count """ *cls*.count += 1 *# Counter.increment()# Counter.increment()# print(Counter.count)* *# Decorator with class using property# it means that the method is dependent on the instance of the class* class *Circle*: """ Circle class """ def \_\_init\_\_(*self*, *radius*: *float*): *self*.\_radius = *radius* @*property* def *area*(*self*): """ calculate area of circle """ return 3.1416 \* (*self*.\_radius \*\* 2) @*property* def *radius*(*self*): """ get radius """ return *self*.\_radius @radius.setter def *radius*(*self*, *value*): """ set radius """ if *value* < 0: raise *ValueError(*"Radius cannot be negative"*)* *self*.\_radius = *value* circle = *Circle(5)print(circle.area)*circle.radius = 10*print(circle.area)*del circle.radius*print(circle.area)*