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