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.
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