Metaclases en Python

Rayven Esplanada 4 diciembre 2021
Metaclases en Python

Este tutorial discutirá qué son las metaclases en un contexto orientado a objetos en Python.

Metaclases en Python

En pocas palabras, una metaclase define el comportamiento de una clase. Una clase regular define cómo se comporta un objeto o una instancia de una clase.

En Python, las metaclases están prefabricadas e implícitas; esto significa que se crea una metaclase en segundo plano al crear una clase.

La clase base object en Python

En Python, cada clase que se crea hereda implícitamente la clase base object. Dentro de la clase object hay métodos privados integrados como __init__ y __new__. Antes de que una clase incluso comience a crear sus propios campos, funciones y atributos, hereda cualquier atributo que haya en la clase object.

Creemos una nueva clase, ChildObject, por ejemplo. Dentro de esta clase hay una declaración de un solo atributo y una sola función.

class ChildObject:
    num = 1

    def printStatement():
        print("This is a child object.")

Para verificar que la clase ChildObject hereda los atributos y funciones de la clase object, use la función dir(), que devuelve una lista de todas las funciones y atributos definidos en un objeto especificado.

print(dir(ChildObject))

Producción :

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'num', 'printStatement']

Observe que antes del atributo num y la función printStatement, hay bastantes atributos privados y funciones que no están explícitamente definidos en ChildObject; esto significa que se definen implícitamente dentro de la clase o se heredan de la clase object.

Comprobemos los atributos y funciones de la clase object utilizando la misma función dir():

print(dir(object))

Producción :

['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

La metaclase type en Python

Ahora que hemos cubierto la clase object, analicemos la metaclase real en Python, type. Una vez más, una metaclase es una clase que crea una instancia y define el comportamiento de otra clase.

Dos funciones pueden exponer la metaclase de una clase dada: type() y __class__. Ambas funciones generan la clase del argumento dado.

Por ejemplo, usemos las funciones type() y __class__ en la clase ChildObject dada de los ejemplos anteriores.

class ChildObject:
    num = 1

    def printStatement():
        print("This is a child object.")


print(type(ChildObject))
print(ChildObject.__class__)

Producción :

<class 'type'>
<class 'type'>

Ambas funciones dan salida a <class 'type'>. Esto indica que la clase ChildObject es de tipo type. type es la metaclase de la clase ChildObject y cualquier otra clase para el caso.

En resumen, type es la metaclase que define implícitamente el comportamiento de cualquier clase instanciada. Esto no se considera de conocimiento común porque se hace en segundo plano del código sin la interferencia del desarrollador. Por lo tanto, el concepto de metaclase solo se conoce si alguien profundiza en el código fuente y la documentación de Python.

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

Artículo relacionado - Python Class