Consejo rápido ¿Qué es una metaclase en Python?

Este rápido consejo ofrece una breve descripción de lo que entendemos por metaclase en Python y muestra algunos ejemplos del concepto..

Antes de profundizar en este artículo, debo señalar un punto importante sobre las clases en Python que nos facilita comprender el concepto de metaclases..

Es una clase un objeto en Python?!

Si ha usado un lenguaje de programación que no sea Python, lo más probable es que el concepto que entendió sobre las clases sea una forma de crear nuevos objetos. Esto también es cierto en Python, pero Python incluso da un paso más: las clases adicionales también se consideran objetos!

Entonces, si creaste la siguiente clase en Python:

clase myClass (objeto): pase

Esto simplemente significa que un objeto con el nombre mi clase ha sido creado en la memoria. Dado que este objeto puede crear nuevos objetos, se considera un clase. Esto significa que podemos aplicar operaciones de objetos en clases en Python, ya que las clases son objetos en sí mismos.

Por lo tanto, podemos realizar operaciones en clases como asignar la clase a una variable, de la siguiente manera:

class_object = myClass () imprime class_object

Que devuelve:

<__main__.myClass object at 0x102623610>

Incluso puedes pasar la clase. mi clase como parámetro a un método, como sigue:

def class_object (object): print object class_object (myClass)

Lo que devuelve el siguiente resultado:

Además de otras operaciones, normalmente puede aplicar objetos..

Metaclases

Tal vez te has encontrado con el tipo palabra clave en Python? Lo más probable es que lo haya usado para verificar el tipo de algún objeto, como se muestra en los siguientes ejemplos:

tipo de impresión ('abder') tipo de impresión (100) tipo de impresión (100.0) tipo de impresión (int)

En cuyo caso obtendrías la siguiente salida:

   

Mirando la salida, todo parece bastante claro hasta que llegas al tipo tipo. Para ver qué significa esto, volvamos a nuestra clase que definimos al principio de este artículo:

clase myClass (objeto): pase

Ahora, haz lo siguiente:

tipo de impresión (myClass)

¿Cuál sería el resultado de esta declaración? Sorprendentemente será:

Entonces, podemos concluir que el tipo de clases en Python es tipo!

¿Cuál es la relación entre un tipo y un metaclase? Bueno un tipo es un metaclase, siempre que el predeterminado metaclase es tipo. Sé que esto podría ser confuso, especialmente que tipo se puede usar para devolver la clase de algún objeto como se muestra arriba, pero esto se debe a la compatibilidad con versiones anteriores en Python. Así que, si escribes:

tipo de impresión (tipo)

Conseguirás:

Lo que significa que un tipo es un tipo!

El termino metaclase simplemente significa algo usado para crear clases. En otras palabras, es la clase de una clase, lo que significa que la instancia de una clase en este caso es una clase. Así, tipo es considerado un metaclase desde la instancia de un tipo es una clase.

Por ejemplo, cuando mencionamos la siguiente declaración anterior:

class_object = myClass ()

Esto simplemente construye un objeto / instancia de la clase mi clase. En otras palabras, usamos una clase para crear un objeto.. 

De la misma manera, cuando hicimos lo siguiente:

clase myClass (objeto): pase

los metaclase fue utilizado para crear la clase mi clase (que se considera una tipo). Entonces, como el objeto es una instancia de una clase, una clase es una instancia de una clase metaclase.

Usando Metaclass para crear una clase

En esta sección, vamos a ver cómo podemos usar un metaclase para crear una clase, en lugar de utilizar el clase Enunciado como vimos en el tutorial de clases y objetos. Como vimos anteriormente, el predeterminado metaclase es tipo. Por lo tanto, podemos usar la siguiente declaración para crear una nueva clase:

new_class = type ('myClass', (), ) 

Si desea simplificar las cosas, puede asignar el mismo nombre de clase mi clase al nombre de la variable.

El diccionario Aquí se utiliza para definir los atributos de la clase. Entonces, teniendo la siguiente declaración:

myClass = type ('myClass', (), 'a': True)

Es parecido a:

clase myClass (objeto): a = Verdadero

El atributo __metaclass__

Digamos que creamos la clase. mi clase como sigue:

clase myClass (objeto): __metaclass__ = myMetaClass pass

En este caso, la creación de la clase se producirá utilizando myMetaClass en lugar de tipo, como sigue:

myClass = myMetaClass (className, bases, dictionary)

Creación e inicialización de una metaclase

Si quieres tener control sobre cómo crear y inicializar una clase después de su creación, simplemente puede utilizar la metaclase __nuevo__ método y __en eso__ constructor, respectivamente. Así que cuando myMetaClass arriba se llama, esto es lo que sucederá detrás de escena:

myClass = myMetaClass .__ new __ (myMetaClass, nombre, bases, diccionario) myMetaClass .__ init __ (myClass, nombre, bases, diccionario)

No quiero alargar este consejo rápido, pero para resumir, podemos concluir que un metaclase Se usa en Python para crear una clase. Es decir, la instancia de un metaclase es una clase Si desea profundizar en las metaclases, puede consultar este tutorial..