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