Python Language Introduction aux Métaclasses


Exemple

Qu'est-ce qu'une métaclasse?

En Python, tout est un objet: les entiers, les chaînes de caractères, les listes, même les fonctions et les classes elles-mêmes sont des objets. Et chaque objet est une instance d'une classe.

Pour vérifier la classe d'un objet x, on peut appeler le type(x) , donc:

>>> type(5)
<type 'int'>
>>> type(str)
<type 'type'>
>>> type([1, 2, 3])
<type 'list'>

>>> class C(object):
...     pass
...
>>> type(C)
<type 'type'>    

La plupart des classes de python sont des instances de type . type lui-même est aussi une classe. Ces classes dont les instances sont aussi des classes sont appelées métaclasses.

La métaclasse la plus simple

OK, donc il y a déjà une métaclasse en Python: type . Pouvons-nous en créer un autre?

class SimplestMetaclass(type):
    pass

class MyClass(object):
    __metaclass__ = SimplestMetaclass

Cela n'ajoute aucune fonctionnalité, mais c'est une nouvelle métaclasse, voyez que MyClass est maintenant une instance de SimplestMetaclass:

>>> type(MyClass)
<class '__main__.SimplestMetaclass'>

Une métaclasse qui fait quelque chose

Une méta - classe qui fait quelque chose remplace généralement le type de __new__ , de modifier certaines propriétés de la classe à créer, avant d' appeler l'original __new__ qui crée la classe:

class AnotherMetaclass(type):
    def __new__(cls, name, parents, dct):
        # cls is this class
        # name is the name of the class to be created
        # parents is the list of the class's parent classes
        # dct is the list of class's attributes (methods, static variables)

        # here all of the attributes can be modified before creating the class, e.g.

        dct['x'] = 8  # now the class will have a static variable x = 8

        # return value is the new class. super will take care of that
        return super(AnotherMetaclass, cls).__new__(cls, name, parents, dct)