Métaclasses en Python

Rayven Esplanada 4 décembre 2021
Métaclasses en Python

Ce tutoriel expliquera ce que sont les métaclasses dans un contexte orienté objet en Python.

Métaclasses en Python

En termes simples, une métaclasse définit le comportement d’une classe. Une classe normale définit le comportement d’un objet ou d’une instance d’une classe.

En Python, les métaclasses sont prédéfinies et implicites ; cela signifie qu’une métaclasse est créée en arrière-plan lors de la création d’une classe.

La classe de base object en Python

En Python, chaque classe créée hérite implicitement de la classe de base object. Dans la classe object se trouvent des méthodes privées intégrées telles que __init__ et __new__. Avant même qu’une classe ne commence à créer ses propres champs, fonctions et attributs, elle hérite de tous les attributs présents dans la classe object.

Créons une nouvelle classe, ChildObject, par exemple. Dans cette classe se trouve une déclaration d’un seul attribut et d’une seule fonction.

class ChildObject:
    num = 1

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

Pour vérifier que la classe ChildObject hérite de tous les attributs et fonctions de la classe object, utilisez la fonction dir(), qui renvoie une liste de toutes les fonctions et attributs définis dans un objet spécifié.

print(dir(ChildObject))

Production:

['__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']

Notez qu’avant l’attribut num et la fonction printStatement, il y a pas mal d’attributs et de fonctions privés qui ne sont pas explicitement définis dans ChildObject ; cela signifie qu’ils sont soit définis implicitement au sein de la classe, soit hérités de la classe object.

Vérifions les attributs et fonctions de la classe object en utilisant la même fonction dir() :

print(dir(object))

Production:

['__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 métaclasse type en Python

Maintenant que nous avons couvert la classe object, discutons de la métaclasse réelle en Python, type. Encore une fois, une métaclasse est une classe qui instancie et définit le comportement d’une autre classe.

Deux fonctions peuvent exposer la métaclasse d’une classe donnée : type() et __class__. Ces deux fonctions génèrent la classe de l’argument donné.

Par exemple, utilisons les fonctions type() et __class__ sur la classe ChildObject donnée des exemples ci-dessus.

class ChildObject:
    num = 1

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


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

Production:

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

Les deux fonctions renvoient <classe 'type'>. Cela signale que la classe ChildObject est de type type. type est la métaclasse de la classe ChildObject et de toute autre classe d’ailleurs.

En résumé, type est la métaclasse qui définit implicitement le comportement de toute classe instanciée. Ceci n’est pas considéré comme de notoriété publique car cela se fait en arrière-plan du code sans l’interférence du développeur. Ainsi, le concept de métaclasse n’est connu que si quelqu’un approfondit le code source et la documentation 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

Article connexe - Python Class