Logotipo de Zephyrnet

Lo que debe saber sobre los decoradores y las metaclases de Python

Fecha:

Lo que debe saber sobre los decoradores y las metaclases de Python
Imagen del autor

Después de escuchar la palabra decoradores, la mayoría de ustedes probablemente adivine que es algo que se usa para la decoración. Lo has adivinado bien. En festividades como Navidad o Año Nuevo, decoramos nuestras casas con diversas luces y materiales. Pero en python, los decoradores se utilizan para modificar o mejorar la funcionalidad de las funciones o métodos de python.

Los decoradores son funciones que envuelven la función original y agregan algunas funcionalidades adicionales sin modificar directamente el código original.

Por ejemplo, imagina que eres dueño de una panadería y experto en hacer pasteles. Haces diferentes pasteles como Chocolate, Fresa y Piña. Todos los pasteles están hechos de diferentes ingredientes, pero algunos pasos son comunes a todos los pasteles, como preparar el molde para hornear, precalentar el horno, hornear el pastel o sacar el pastel del horno. Entonces, podemos hacer una función de decorador común para realizar todos los pasos comunes, hacer funciones separadas para diferentes tipos de pasteles y usar los decoradores para agregar funcionalidad común a estas funciones.

Considere el siguiente código.

def common_steps(func): def wrapper(): print("Preparing baking pans...") print("Pre-heating the oven...") result = func() print("Baking the cake...") print("Removing the cake from the oven...") return result return wrapper @common_steps
def chocolate_cake(): print("Mixing the chocolate...") return "Chocolate cake is ready!" @common_steps
def strawberry_cake(): print("Mixing the strawberries...") return "Strawberry cake is ready!" @common_steps
def pineapple_cake(): print("Mixing the pineapples...") return "Pineapple cake is ready!" print(pineapple_cake())

Salida:

Preparing baking pans...
Pre-heating the oven...
Mixing the pineapples...
Baking the cake...
Removing the cake from the oven...
Pineapple cake is ready!

La función comman_steps se define como un decorador y contiene todos los pasos comunes como hornear o precalentar. Y las funciones chocolate_cake, strawberry_cakey pineapple_cake se definen, que contienen diferentes pasos para diferentes tipos de tortas.

Los decoradores se definen mediante el @ símbolo, seguido del nombre de la función decoradora.

Cada vez que se define una función con un decorador, se llama a la función original con el decorador, y la función decoradora devuelve una nueva función que reemplaza a la función original.

La nueva función realiza las funcionalidades adicionales antes y después de llamar a la función original.

En vez de @ símbolo, puede definir los decoradores de otra manera que proporcione los mismos resultados. P.ej,

def pineapple_cake(): print("Mixing the pineapples...") return "Pineapple cake is ready!" pineapple_cake = common_steps(pineapple_cake) print(pineapple_cake())

Beneficios de usar decoradores:

  1. Puede usar el mismo código repetidamente sin redundancia y evitar el principio DRY (Don't Repeat Yourself).
  2. Esto hace que su código sea más legible y fácil de mantener.
  3. Puede mantener su código organizado y claro, lo que lo ayuda con problemas como la validación de entrada, el manejo de errores o los problemas de optimización.
  4. Usando decoradores, puede agregar nuevas funcionalidades a las funciones o clases existentes sin modificar el código. Esto le permite extender el código de acuerdo con los requisitos de su negocio.

Es la clase de una clase y define cómo se puede comportar una clase. Una clase es en sí misma una instancia de una metaclase.

Antes de comprender la definición de una metaclase, primero, comprenda la definición básica de la clase y los objetos de Python. La clase es como un constructor que se usa para crear objetos. Estamos creando clases para crear objetos. Los objetos también se conocen como la instancia de una clase utilizada para acceder a los atributos de la clase. Los atributos pueden ser cualquier tipo de datos, como un número entero, una cadena, una tupla, una lista, una función o incluso una clase. Entonces, para usar estos atributos, tenemos que crear instancias (objetos) en la clase, y el método para crear estas instancias se conoce como creación de instancias.

Todo en python se trata como un objeto. Incluso una clase también se trata como un objeto. Eso significa que una clase se instancia desde una clase diferente. La clase a partir de la cual se instancian todas las demás clases se conoce como metaclase. La clase define el comportamiento de un objeto al que pertenece. De la misma manera, el comportamiento de la clase está definido por su metaclase, que es una Tipo de Propiedad clase por defecto. En términos más simples, todas las clases son instancias de una metaclase en Python.

¿Qué es una clase de tipo?

En Python, el Tipo de Propiedad class es la metaclase para todas las clases. Cada vez que define una nueva clase, por defecto, se instancia desde la clase Tipo a menos que defina otra metaclase.

La clase de tipos también es responsable de la creación dinámica de clases de python. Cuando definimos una nueva clase, Python envía la definición de clase a la clase de tipo y luego esta clase crea un nuevo objeto de clase de acuerdo con la definición de clase.

Consideremos un ejemplo.

class College: pass obj = College()
print(type(obj))
print(type(College))

Salida:

<class '__main__.College>
<class 'type'>

Una nueva clase llamada College se crea, y un objeto obj de esa clase es instanciada. Pero cuando imprimimos el tipo de objeto, sale como <class '__main__.College>, lo que significa que un objeto en particular se crea a partir de la College clase. Pero por otro lado, cuando imprimimos el tipo del College clase, sale como <class 'type'>, lo que significa que esta clase se crea a partir de la clase de tipo (metaclase) por defecto.

También podemos cambiar la metaclase predeterminada de estas clases definidas por el usuario. Considere el siguiente ejemplo.

class College(type): pass class Student(metaclass=College): pass print(type(Student))
print(type(College))

Salida:

<class '__main__.College'>
<class 'type'>

Cuando imprimimos el tipo de Student clase, se refiere a la College como una metaclase, pero cuando imprimimos el tipo de la College clase, se refiere a la tipo clase como una metaclase. Así que esto forma una jerarquía, como se muestra a continuación.

 

Lo que debe saber sobre los decoradores y las metaclases de Python
Imagen del autor 

También podemos usar tipo class para la creación dinámica de nuevas clases. Entendamos esto más con el siguiente ejemplo.

# This is the basic way of defining a class.
class MyClass: pass # Dynamic creation of classes.
myclass = type("MyClass", (), {})

Ambas formas de definir las clases son equivalentes. La función type() se usa en este ejemplo para crear una nueva clase. Se necesitan tres argumentos. El primer argumento toma el nombre de la clase, el segundo es una tupla de las clases principales (vacío en este caso) y el tercer argumento es un diccionario que toma los atributos de esa clase (también vacío en este caso).

Considere otro ejemplo que utiliza el concepto de herencia.

College = type("College", (), {"clgName": "MIT University"})
Student = type("Student", (College,), {"stuName": "Kevin Peterson"})
obj = Student()
print(obj.stuName, "-", obj.clgName)

Salida:

Kevin Peterson - MIT University

Una clase llamada College se crea teniendo el argumento clgName as MIT University. Otra clase Student es creado, heredado del College clase y un atributo stuName as Kevin Peterson es creado.

Cuando creamos un objeto de la clase `Estudiante`, podemos ver que puede acceder a los atributos de ambas clases. Significa que la herencia funciona perfectamente en este ejemplo.

En este artículo, hemos discutido Decorators y Metaclasses en python. Tanto la metaclase como los decoradores modifican el comportamiento de las clases y funciones pero operan usando diferentes mecanismos.

Las metaclases operan en el nivel inferior y le permiten cambiar la estructura o el comportamiento de la clase, como los métodos, atributos y herencia de la clase. Los decoradores, sin embargo, se utilizan para modificar el comportamiento de las funciones. Le permitieron agregar funcionalidad a las funciones existentes sin cambiar el código. Los decoradores operan a un nivel superior en comparación con las metaclases. Por eso son algo más fáciles de entender y menos complejas que las metaclases.

 

Lo que debe saber sobre los decoradores y las metaclases de Python
Diferencia entre Metaclase y Decoradores | Imagen por autor 

Es todo por hoy. Espero que hayas disfrutado leyendo este artículo. Si tiene algún comentario o sugerencia, por favor póngase en contacto conmigo a través de LinkedIn.

 
 
Garg ario es un B.Tech. Estudiante de Ingeniería Eléctrica, actualmente en el último año de la carrera. Su interés radica en el campo del Desarrollo Web y el Aprendizaje Automático. Ha perseguido este interés y estoy ansioso por trabajar más en estas direcciones.

punto_img

Información más reciente

punto_img