Supposons que je souhaite créer une classe abstraite en python avec certaines méthodes à mettre en œuvre par des sous-classes, par exemple: J'aimerais que si la classe de base est instanciée si la classe de base est instanciée. et sa méthode Quelle est la chose habituelle à faire ici? Devrais-je soulever un F () code> lorsque
self.g () code> est appelé, qui jette une exception vous indiquant qu'une sous-classe doit avoir mis en œuvre la méthode
g () code>. strong> p>
notimplederror? Code> ou y a-t-il une façon plus spécifique de le faire? P> p>
3 Réponses :
Faites une méthode qui ne fait rien, mais a toujours une doctrine expliquant l'interface. Obtenir un NameError CODE> est déroutant et émettons
notimpleDederror code> (ou une autre exception, pour cette affaire) va casser une utilisation appropriée de
super code>. P >
Comment soulever une erreur d'une erreur d'utilisation appropriée de super code>?
Super code> 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 code> (comme elles doivent être), alors les deux implémentations seront appelées.
Bon appel. J'ai supprimé ma réponse.
in Python 2.6 et mieux, vous pouvez utiliser le ABC Module pour faire Ceci garantit que code> ne peut pas être instancié - et aucune sous-classe ne peut pas être remplacée 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. P > p> Base code> une classe de base abstraite "en fait":
g code> - Tout en répondant à la cible d'Aaron de permettre à des sous-classes d'utiliser
Super code> dans leurs implémentations
g code>. Globalement, une bien meilleure solution que ce que nous avions à Python 2.5 et plus tôt! P>
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): ...
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
Notez que Il suffit de mentionner B> Abstrait code> comme
Methody1 CODE> SOPHY Body ne fait rien du tout: vous devez appeler b>. 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 b>, qui est toujours utile pour la fixation d'erreurs.