ABC vs ABCMeta en Python, quelle différence ?

Article publié le 12/05/2025 par Jules SAGOT

Il y a deux possibilités afin de déclarer une classe abstraite en Python :

from abc import ABC, ABCMeta

class MyABC1(ABC):
    pass

class MyABC2(metaclass=ABCMeta):
    pass

Ces deux manières de faire sont équivalentes. Cette fiche pratique va vous aider à choisir !

ABCMeta, la manière explicite mais déroutante

from abc import ABCMeta

class MyABC(metaclass=ABCMeta):
    pass

En Python, une metaclass est une classe qui crée des classes.

Dans class MyABC(metaclass=ABCMeta): pass, la métaclass ABCMeta va modifier le comportement de MyABC et la transformer en classe abstraite.

ABC, la manière détournée mais plus compréhensible

from abc import ABC

class MyABC(ABC):
    pass

La notion de metaclass est propre à Python.

Pour éviter d’ajouter trop de complexité, vous pouvez passer un simple héritage de ABC pour obtenir le même résultat.

Voici le code source de ABC :

class ABC(metaclass=ABCMeta):
    """Helper class that provides a standard way to create an ABC using
    inheritance.
    """
    __slots__ = ()

De cette façon, ABC permet de cacher au développeur que la propriété metaclass existe.

Conclusion

Ces deux façons de faire sont équivalentes.

metaclass=ABCMeta expose le mécanisme utilisé par Python pour modifier le comportement de notre classe et la rendre abstraite.

ABC arrive au même résultat, avec un héritage au lieu de la propriété metaclass.

Je vous recommande l’utilisation de ABC par héritage car c’est la manière la plus simple et la plus lisible de créer une classe abstraite.

Pour aller plus loin, vous pouvez consulter la fiche pratique complète pour comprendre les classes abstraites en Python