Différence entre une classe abstraite et une interface en Python
Quelle est la différence entre une classe abstraite et une interface en Python?
Vous devez vous connecter pour publier un commentaire.
Quelle est la différence entre une classe abstraite et une interface en Python?
Vous devez vous connecter pour publier un commentaire.
Ce que vous allez voir, parfois, est la suivante:
Parce que Python n'a pas (et n'a pas besoin) une Interface formelle du contrat, la Java de style distinction entre l'abstraction et l'interface n'existe pas. Si quelqu'un passe par la définition d'une interface formelle, il sera aussi une classe abstraite. La seule différence serait dans l'intention énoncée dans la docstring.
Et la différence entre l'abstrait et l'interface est un donner matière à tergiverser chose quand vous avez duck-typing.
Java utilise les interfaces car il n'a pas l'héritage multiple.
Parce que Python a l'héritage multiple, vous pouvez également voir quelque chose comme ceci
Il utilise une sorte de résumé de la superclasse avec mixin pour créer des sous-classes concrètes qui sont disjoints.
NotImplementedError("Class %s doesn't implement aMethod()" % (self.__class__.__name__))
est plus instructif message d'erreur 🙂Une interface, d'un objet, est un ensemble de méthodes et d'attributs de cet objet.
En Python, on peut utiliser une classe de base abstraite pour définir et d'appliquer une interface.
À l'aide d'une Classe de Base Abstraite
Par exemple, disons que nous voulons utiliser l'une des classes de base abstraites de la
collections
module:Si nous essayons de l'utiliser, nous obtenons un
TypeError
parce que la classe que nous avons créé ne supporte pas le comportement attendu de jeux:Nous sommes donc tenus de mettre en œuvre au moins
__contains__
,__iter__
, et__len__
. Profitons de cet exemple de mise en œuvre de la la documentation:Mise en œuvre: la Création d'une Classe de Base Abstraite
Nous pouvons créer notre propre Classe de Base Abstraite par la définition de la métaclasse à
abc.ABCMeta
et à l'aide de laabc.abstractmethod
décorateur sur les méthodes pertinentes. La métaclasse seront ajouter la décorées fonctions à la__abstractmethods__
attribut, la prévention de l'instanciation jusqu'à ce que ceux-ci sont définis.Par exemple, "effable" est défini comme quelque chose qui peut être exprimée en mots. Disons que nous voulons définir une classe de base abstraite qui est effable, en Python 2:
Ou en Python 3, avec le léger changement dans la métaclasse déclaration:
Maintenant, si nous essayons de créer un effable objet sans la mise en œuvre de l'interface:
et tenter de les instancier:
On nous dit que nous n'avons pas fini le travail.
Maintenant, si nous nous conformons en fournissant l'interface attendue:
nous sommes alors en mesure d'utiliser la version concrète de la classe dérivée à partir de l'abstrait:
Il y a d'autres choses qu'on pourrait faire avec cela, comme registre virtuel des sous-classes qui mettent déjà en œuvre ces interfaces, mais je pense que c'est au-delà de la portée de cette question. Les autres méthodes ont démontré ici aurait l'adaptation de cette méthode à l'aide de la
abc
module de le faire, cependant.Conclusion
Nous avons démontré que la création d'une Classe de Base Abstraite définit les interfaces des objets personnalisés en Python.
Python >= 2.6 a Les Classes De Base Abstraites.
Il y a aussi le Zope Interface module, qui est utilisé par les projets à l'extérieur de zope, comme des tordus. Je ne suis pas vraiment familier avec elle, mais il y a une page wiki ici qui pourrait vous aider.
En général, vous n'avez pas besoin de la notion de classes abstraites, interfaces ou en python (édité - voir S. Lott réponse pour plus de détails).
Python n'a pas vraiment de concept soit.
Il utilise duck-typing, qui a supprimé la nécessité pour les interfaces (au moins pour l'ordinateur :-))
Python <= 2.5:
Les classes de Base existent bien sûr, mais il n'y a pas de façon explicite à marquer d'une méthode comme "virtuelle pure", de sorte que la classe n'est pas vraiment abstrait.
Python >= 2.6:
Les classes de base abstraites ne existe (http://docs.python.org/library/abc.html). Et vous permettent de spécifier les méthodes qui doivent être mises en œuvre dans les sous-classes. Je n'aime pas beaucoup la syntaxe, mais la fonctionnalité est là. La plupart du temps, il est probablement préférable d'utiliser duck tape à partir de la "utilise" côté client.
D'une manière plus simple à expliquer:
Une interface est un peu comme un vide moule à muffins.
C'est un fichier de classe à un ensemble de définitions de méthode qui n'ont pas de code.
Une classe abstraite est la même chose, mais pas toutes les fonctions doivent être vides. Certains peuvent avoir code. Il n'est pas strictement vide.
Pourquoi différencier:
Il n'y a pas beaucoup de différence pratique en Python, mais au niveau de la planification pour un grand projet, il pourrait être plus fréquent de parler d'interfaces, car il n'y a pas de code. Surtout si vous travaillez avec des programmeurs Java qui sont habitués à ce terme.
En général, les interfaces sont utilisées que dans les langues qui utilisent l'unique héritage de la classe de modèle. Dans ces seul héritage langues, les interfaces sont généralement utilisés si une classe peut utiliser une méthode particulière ou d'un ensemble de méthodes. Aussi dans ces seul héritage langues, les classes abstraites sont utilisées pour avez défini les variables de classe en plus de aucun ou plusieurs méthodes, ou d'exploiter le seul modèle d'héritage de limiter la portée des classes qui pourrait utiliser un ensemble de méthodes.
Langages qui prennent en charge le multi-héritage du modèle ont tendance à utiliser uniquement des classes ou des classes de base abstraites et non des interfaces. Depuis Python supporte l'héritage multiple, il n'est pas utiliser les interfaces et que vous voulez utiliser les classes de base ou les classes de base abstraites.
http://docs.python.org/library/abc.html