NotImplementedError
Python
Erreur courante
Explication
`NotImplementedError` est une erreur **levée volontairement** pour signaler qu'une méthode doit être **implémentée par une sous-classe**, ou qu'une fonctionnalité n'est pas encore écrite. Ce n'est pas un bug accidentel : c'est un marqueur posé par le développeur.
```python
class Forme:
def aire(self):
raise NotImplementedError("à implémenter dans la sous-classe")
class Carre(Forme):
pass # on a oublié de définir aire()
Carre().aire()
# NotImplementedError: à implémenter dans la sous-classe
```
Causes courantes
- **Appel d'une méthode abstraite** non redéfinie dans la sous-classe. - **Sous-classe incomplète** : une méthode obligatoire manque. - **Fonctionnalité « à faire »** marquée explicitement.
1. Implémentez la méthode dans la sous-classe
class Carre(Forme):
def __init__(self, cote):
self.cote = cote
def aire(self):
return self.cote ** 2 # ✅
2. Forcez l'implémentation avec abc
Une classe abstraite empêche même d'instancier une sous-classe incomplète :
from abc import ABC, abstractmethod
class Forme(ABC):
@abstractmethod
def aire(self): ...
class Carre(Forme):
pass
Carre() # TypeError immédiat : aire() non implémentée
Comment prevenir cette erreur
- **Utilisez `abc.ABC` + `@abstractmethod`** : l'erreur apparaît à l'instanciation, plus tôt et plus clairement.
- **Documentez** les méthodes à implémenter dans la classe de base.
- Référence : [docs.python.org — abc](https://docs.python.org/fr/3/library/abc.html).
Besoin d'aide sur votre projet ?
Besoin d'aide sur un probleme technique ? Decrivez-le pour des recommandations.
Nous contacterQuestions frequentes
Quelle différence entre `NotImplementedError` et `NotImplemented` ?
`NotImplementedError` est une **exception** que l'on lève. `NotImplemented` est une **valeur spéciale** renvoyée par les méthodes de comparaison (`__eq__`, `__add__`...) pour dire « je ne sais pas traiter ce type ». Ne les confondez pas.
Comment garantir qu'une sous-classe implémente bien une méthode ?
Déclarez la classe de base avec `ABC` et la méthode avec `@abstractmethod`. Python refusera alors d'instancier toute sous-classe qui ne la redéfinit pas.