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