12
votes

Quelle exception pour notifier que la sous-classe doit mettre en œuvre une méthode?

Supposons que je souhaite créer une classe abstraite en python avec certaines méthodes à mettre en œuvre par des sous-classes, par exemple: xxx

J'aimerais que si la classe de base est instanciée si la classe de base est instanciée. et sa méthode F () lorsque self.g () est appelé, qui jette une exception vous indiquant qu'une sous-classe doit avoir mis en œuvre la méthode g () .

Quelle est la chose habituelle à faire ici? Devrais-je soulever un notimplederror? ou y a-t-il une façon plus spécifique de le faire?


0 commentaires

3 Réponses :


2
votes

Faites une méthode qui ne fait rien, mais a toujours une doctrine expliquant l'interface. Obtenir un NameError est déroutant et émettons notimpleDederror (ou une autre exception, pour cette affaire) va casser une utilisation appropriée de super .


3 commentaires

Comment soulever une erreur d'une erreur d'utilisation appropriée de super ? Super ne serait pas appelé dans ce cas car la sous-classe immédiate ne l'appellerait pas. Tous les appels vers Super plus loin dans la chaîne d'héritage fonctionneraient bien.


@aaronasterling, pourquoi la sous-classe immédiate n'appelle-t-elle pas? Si vous avez deux classes qui héritent d'une base et mettent en œuvre la méthode et une classe qui hérite des deux, une seule des implémentations sera appelée. Si les deux sous-classes immédiates appellent Super (comme elles doivent être), alors les deux implémentations seront appelées.


Bon appel. J'ai supprimé ma réponse.



14
votes

in Python 2.6 et mieux, vous pouvez utiliser le ABC Module pour faire Base une classe de base abstraite "en fait": xxx

Ceci garantit que ne peut pas être instancié - et aucune sous-classe ne peut pas être remplacée g - Tout en répondant à la cible d'Aaron de permettre à des sous-classes d'utiliser Super dans leurs implémentations g . Globalement, une bien meilleure solution que ce que nous avions à Python 2.5 et plus tôt!

Note latérale: Avoir la base hériter de l'objet serait redondant, car la métaclasse doit être définie explicitement de toute façon.


2 commentaires

hah. Je viens de recevoir une implémentation de base de cette course! Je vais finir quand même comme un exercice puis voir comment la mine empile contre le fonctionnaire.


Juste comme un nœud latéral: dans Python 3.x, la métaclasse est définie comme ceci: base de classe (métaclass = abc.abcmeta): ...



0
votes

Peter Norvig a donné une solution à cela dans son python Résommeration des questions Liste. Je vais reproduire ici ici. Découvrez l'IAQ, il est très utile. xxx


1 commentaires

Notez que Il suffit de mentionner Abstrait comme Methody1 SOPHY Body ne fait rien du tout: vous devez appeler . Quoi qu'il en soit, tandis que @ Peter's Ised a la peine d'être valable de 2,5 ans et plus tôt, en 2.6 et plus tard, le module ABC que je recommande est meilleur: l'erreur vient ASAP, dès qu'une classe toujours abstraite est instanciée , qui est toujours utile pour la fixation d'erreurs.