Vous ne pouvez pas, avec les primitives du langage. Comme on l'a dit, le paquet abc fournit cette fonctionnalité à partir de la version 2.6 de Python, mais il n'existe pas d'option pour Python 2.5 et les versions antérieures. Le site abc
n'est pas une nouvelle fonctionnalité de Python ; au lieu de cela, il ajoute une fonctionnalité en ajoutant des contrôles explicites "cette classe dit-elle qu'elle fait ceci ?", avec des contrôles de cohérence implémentés manuellement pour provoquer une erreur pendant l'initialisation si de telles déclarations sont fausses.
Python est un langage à typage dynamique militant. Il ne spécifie pas de primitives de langage vous permettant d'empêcher un programme de compiler parce qu'un objet ne correspond pas aux exigences de type ; ceci ne peut être découvert qu'au moment de l'exécution. Si vous exigez qu'une sous-classe implémente une méthode, documentez-le, puis appelez la méthode en espérant aveuglément qu'elle sera présente.
S'il est là, fantastique, il fonctionne tout simplement ; c'est ce qu'on appelle dactylographie du canard et votre objet a fait suffisamment de bruit de canard pour satisfaire l'interface. Cela fonctionne très bien même si self
est l'objet sur lequel vous appelez une telle méthode à des fins de remplacement obligatoire en raison de méthodes de base qui nécessitent des implémentations spécifiques de fonctionnalités (fonctions génériques), car self
est une convention, et non quelque chose de spécial.
L'exception se trouve dans __init__
En effet, lorsque votre initialisateur est appelé, l'initialisateur du type dérivé ne l'a pas fait, et il n'a donc pas encore eu l'occasion d'agrafer ses propres méthodes à l'objet.
Si la méthode n'a pas été implémentée, vous obtiendrez un AttributeError (si elle n'existe pas du tout) ou un TypeError (si quelque chose portant ce nom existe mais que ce n'est pas une fonction ou qu'elle n'avait pas cette signature). C'est à vous de voir comment vous gérez cela : soit vous appelez cela une erreur de programmeur et vous laissez le programme se planter (et il "devrait" être évident pour un développeur python de savoir ce qui cause ce genre d'erreur : une interface de canard non satisfaite), soit vous attrapez et gérez ces exceptions lorsque vous découvrez que votre objet ne supporte pas ce que vous souhaitez qu'il supporte. Attraper AttributeError et TypeError est important dans de nombreuses situations, en fait.
6 votes
Les interfaces abstraites et autres n'ont été introduites que récemment. Puisque python n'est pas compilé, vous devriez préciser votre intention dans la documentation plutôt que dans les classes abstraites.
0 votes
Également un très une bonne application pour les tests unitaires. Comme Python n'est pas compilé, je ne commence pas à faire confiance à un code avant de l'avoir testé à l'unité.