Python Language Métaclasses de base


Exemple

Lorsque type est appelé avec trois arguments, il se comporte comme la classe (méta) et crée une nouvelle instance, c.-à-d. il produit une nouvelle classe / type.

Dummy = type('OtherDummy', (), dict(x=1))
Dummy.__class__              # <type 'type'> 
Dummy().__class__.__class__  # <type 'type'> 

Il est possible de sous-classer le type pour créer une métaclasse personnalisée.

class mytype(type):
    def __init__(cls, name, bases, dict):
        # call the base initializer
        type.__init__(cls, name, bases, dict)

        # perform custom initialization...
        cls.__custom_attribute__ = 2

Maintenant, nous avons une nouvelle métaclasse personnalisée mytype qui peut être utilisée pour créer des classes de la même manière que le type .

MyDummy = mytype('MyDummy', (), dict(x=2))
MyDummy.__class__              # <class '__main__.mytype'>
MyDummy().__class__.__class__  # <class '__main__.mytype'>
MyDummy.__custom_attribute__   # 2

Lorsque nous créons une nouvelle classe en utilisant le mot-clé class la métaclasse est choisie par défaut en fonction des classes de base.

>>> class Foo(object):
...     pass

>>> type(Foo)
type

Dans l'exemple ci-dessus, la seule classe de base est object donc notre métaclasse sera le type d' object , qui est le type . Il est possible de remplacer la valeur par défaut, mais cela dépend si nous utilisons Python 2 ou Python 3:

Python 2.x 2.7

Un attribut spécial au niveau de la classe __metaclass__ peut être utilisé pour spécifier la métaclasse.

class MyDummy(object):
    __metaclass__ = mytype
type(MyDummy)  # <class '__main__.mytype'>
Python 3.x 3.0

Un argument spécial de mot-clé de metaclass spécifie la métaclasse.

class MyDummy(metaclass=mytype):
    pass
type(MyDummy)  # <class '__main__.mytype'>

Tout argument de mot-clé (sauf la metaclass ) dans la déclaration de classe sera transmis à la métaclasse. Ainsi, la class MyDummy(metaclass=mytype, x=2) transmettra x=2 comme argument mot-clé au constructeur mytype .

Lisez cette description détaillée des méta-classes de python pour plus de détails.