Utiliser des métaclasses
Il est enfin temps d'utiliser les métaclasses, mais d'une manière générale, nous n'en avons pas du tout besoin. Comme l'a dit Tim Peters, le leader de la communauté Python :
Les métaclasses sont la magie de la profondeur, et 99 % des utilisateurs ne devraient pas le faire. je dois absolument faire ça. Si vous vous demandez si vous avez besoin d’une métaclasse, vous n’en avez pas besoin. Ceux qui utilisent réellement les métaclasses savent exactement ce qu’ils doivent faire et n’ont pas du tout besoin d’expliquer pourquoi elles sont utilisées.
L'objectif principal des métaclasses est de créer des API. Un exemple typique est Django ORM. Il vous permet de le définir comme ceci :
class Person(models.Model): name = models.CharField(max_length=30) age = models.IntegerField()
Mais si vous faites ceci :
guy = Person(name='bob', age='35') print guy.age
cela ne renverra pas un objet IntegerField, mais renverra un int, ou même récupérera les données directement de la base de données. Cela est possible car models.Model définit __metaclass__ et utilise un peu de magie pour transformer la simple classe Person que vous venez de définir en un hook complexe vers la base de données. Le framework Django simplifie ces choses apparemment complexes en exposant une API simple utilisant des métaclasses, à travers lesquelles le code est recréé et le vrai travail est effectué en coulisses.
Tout en Python est un objet, c'est soit une instance d'une classe, soit une métaclasse, sauf le type. type est en fait sa propre métaclasse, ce qui est quelque chose que vous ne pouvez pas faire dans un environnement Python pur. Cela se fait par une astuce au niveau de l'implémentation.