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_cake
y 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:
- Puede usar el mismo código repetidamente sin redundancia y evitar el principio DRY (Don't Repeat Yourself).
- Esto hace que su código sea más legible y fácil de mantener.
- 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.
- 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.
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.
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.
- Distribución de relaciones públicas y contenido potenciado por SEO. Consiga amplificado hoy.
- Platoblockchain. Inteligencia del Metaverso Web3. Conocimiento amplificado. Accede Aquí.
- Fuente: https://www.kdnuggets.com/2023/03/know-python-decorators-metaclasses.html?utm_source=rss&utm_medium=rss&utm_campaign=what-you-should-know-about-python-decorators-and-metaclasses