Petite astuce Qu'est-ce qu'une métaclasse en Python?

Cette astuce donne un bref aperçu de ce que nous entendons par métaclasse en Python et donne quelques exemples du concept..

Avant de plonger dans cet article, je voudrais signaler un point important concernant les classes en Python, qui nous permet de mieux comprendre le concept de métaclasse..

Est-ce qu'une classe est un objet en Python?!

Si vous avez utilisé un langage de programmation autre que Python, le concept que vous avez compris à propos des classes est très probablement le moyen utilisé pour créer de nouveaux objets. Ceci est également vrai en Python, mais Python va encore plus loin, car les classes sont également considérées comme des objets.!

Donc, si vous avez créé la classe suivante en Python:

classe myClass (objet): pass

Cela signifie simplement qu'un objet avec le nom Ma classe a été créé en mémoire. Depuis que cet objet est capable de créer de nouveaux objets, il est considéré comme un classe. Cela signifie que nous pouvons appliquer des opérations d'objet sur des classes en Python, car les classes sont des objets eux-mêmes..

Nous pouvons donc faire des opérations sur les classes comme assigner la classe à une variable, comme suit:

class_object = myClass () print class_object

Qui retourne:

<__main__.myClass object at 0x102623610>

Vous pouvez même passer la classe Ma classe en tant que paramètre d'une méthode, comme suit:

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

Ce qui retourne la sortie suivante:

En plus d'autres opérations que vous pouvez normalement appliquer sur des objets.

Métaclasses

Peut-être avez-vous rencontré le type mot-clé en Python? Vous l'avez probablement utilisé pour vérifier le type d'un objet, comme illustré dans les exemples suivants:

type d'impression ('abder') type d'impression (100) type d'impression (100.0) type d'impression (int)

Dans ce cas, vous obtiendrez le résultat suivant:

   

En regardant la sortie, tout semble assez clair jusqu'à ce que vous arriviez au type type. Pour voir ce que cela pourrait signifier, revenons à notre classe que nous avons définie au début de cet article:

classe myClass (objet): pass

Maintenant, procédez comme suit:

type d'impression (myClass)

Quelle serait la sortie de cette déclaration? Ce sera étonnamment:

Donc, nous pouvons conclure que le type de classes en Python est type!

Quelle est la relation entre un type et un métaclasse? Bien, un type est un métaclasse, à condition que le défaut métaclasse est type. Je sais que cela peut être déroutant, surtout que type peut être utilisé pour retourner la classe d'un objet comme indiqué ci-dessus, mais cela est dû à la compatibilité avec les versions antérieures de Python. Donc, si vous écrivez:

type d'impression (type)

Tu auras:

Ce qui signifie qu'un type est un type!

Le terme métaclasse signifie simplement quelque chose utilisé pour créer des classes. En d'autres termes, il s'agit de la classe d'une classe, ce qui signifie que l'instance d'une classe dans ce cas est une classe. Ainsi, type est considéré comme un métaclasse depuis l'instance d'un type est une classe.

Par exemple, lorsque nous avons mentionné la déclaration suivante ci-dessus:

class_object = myClass ()

Cela construit simplement un objet / instance de la classe Ma classe. En d'autres termes, nous avons utilisé une classe pour créer un objet. 

De la même manière, quand nous avons fait ce qui suit:

classe myClass (objet): pass

le métaclasse a été utilisé pour créer la classe Ma classe (qui est considéré comme un type). Donc, comme l’objet étant une instance d’une classe, une classe est une instance d’un métaclasse.

Utiliser Metaclass pour créer une classe

Dans cette section, nous allons voir comment utiliser un métaclasse pour créer une classe, plutôt que d'utiliser le classe déclaration que nous avons vu dans le tutoriel classes et objets. Comme nous l'avons vu ci-dessus, le défaut métaclasse est type. Ainsi, nous pouvons utiliser l'instruction suivante pour créer une nouvelle classe:

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

Si vous voulez simplifier les choses, vous pouvez attribuer le même nom de classe. Ma classe au nom de la variable.

Le dictionnaire ici est utilisé pour définir les attributs de la classe. Donc, ayant la déclaration suivante:

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

Est similaire à:

classe myClass (objet): a = True

L'attribut __metaclass__

Disons que nous avons créé la classe Ma classe comme suit:

classe myClass (objet): __metaclass__ = passe myMetaClass

Dans ce cas, la création de classe aura lieu en utilisant myMetaClass au lieu de type, comme suit:

myClass = myMetaClass (className, bases, dictionnaire)

Création et initialisation d'une métaclasse

Si vous voulez avoir le contrôle sur la façon dont vous créer et initialiser une classe après sa création, vous pouvez simplement utiliser la métaclasse __Nouveau__ méthode et __init__ constructeur, respectivement. Donc quand myMetaClass ci-dessus est appelé, voici ce qui se passera dans les coulisses:

myClass = myMetaClass .__ new __ (myMetaClass, nom, bases, dictionnaire) myMetaClass .__ init __ (myClass, nom, bases, dictionnaire)

Je ne veux pas prolonger ce conseil rapide, mais pour résumer, nous pouvons conclure qu'un métaclasse est utilisé en Python pour créer une classe. C'est, l'instance d'un métaclasse est une classe. Si vous souhaitez approfondir les métaclasses, vous pouvez consulter ce tutoriel..