640 Stimmen

Unterschied zwischen abstrakter Klasse und Schnittstelle in Python

Was ist der Unterschied zwischen abstrakter Klasse und Schnittstelle in Python?

21voto

Lara Dougan Punkte 771

Im Allgemeinen werden Schnittstellen nur in Sprachen verwendet, die das Modell der Einfachvererbung von Klassen verwenden. In diesen Sprachen mit Einfachvererbung werden Schnittstellen typischerweise verwendet, wenn jede Klasse eine bestimmte Methode oder einen Satz von Methoden verwenden könnte. Auch in diesen Sprachen mit Einfachvererbung werden abstrakte Klassen verwendet, um entweder zusätzlich zu keiner oder mehreren Methoden definierte Klassenvariablen zu haben oder um das Modell der Einfachvererbung auszunutzen, um den Bereich der Klassen zu begrenzen, die einen Satz von Methoden verwenden können.

Sprachen, die das Modell der Mehrfachvererbung unterstützen, neigen dazu, nur Klassen oder abstrakte Basisklassen und keine Schnittstellen zu verwenden. Da Python die Mehrfachvererbung unterstützt, verwendet es keine Schnittstellen, und Sie sollten Basisklassen oder abstrakte Basisklassen verwenden.

http://docs.python.org/library/abc.html

4voto

Akash Ukarande Punkte 321

Abstrakte Klassen sind Klassen, die eine oder mehrere abstrakte Methoden enthalten. Neben abstrakten Methoden können abstrakte Klassen auch statische, Klassen- und Instanzmethoden haben. Im Falle einer Schnittstelle verfügt sie jedoch nur über abstrakte Methoden, nicht über andere. Daher ist es nicht obligatorisch, eine abstrakte Klasse zu erben, aber es ist obligatorisch, eine Schnittstelle zu erben.

0voto

Sławomir Lenart Punkte 6134

Der Vollständigkeit halber sollten wir erwähnen PEP3119 wo ABC eingeführt und mit Schnittstellen verglichen wurde, und ursprüngliche Talin Kommentar.

Die abstrakte Klasse ist keine perfekte Schnittstelle:

  • gehört zur Vererbungshierarchie
  • ist veränderbar

Aber wenn man bedenkt, dass man es auf seine eigene Weise schreibt:

def some_function(self):
     raise NotImplementedError()

interface = type(
    'your_interface', (object,),
    {'extra_func': some_function,
     '__slots__': ['extra_func', ...]
     ...
     '__instancecheck__': your_instance_checker,
     '__subclasscheck__': your_subclass_checker
     ...
    }
)

ok, rather as a class
or as a metaclass
and fighting with python to achieve the immutable object
and doing refactoring
...

werden Sie recht schnell merken, dass Sie das Rad erfinden um schließlich zu erreichen abc.ABCMeta

abc.ABCMeta wurde als nützliche Ergänzung der fehlenden Schnittstellenfunktionalität vorgeschlagen, und das ist in einer Sprache wie Python nur recht und billig.

Sicherlich konnte sie bei der Erstellung von Version 3 noch verbessert werden, indem eine neue Syntax und ein unveränderliches Schnittstellenkonzept hinzugefügt wurden ...

Schlussfolgerung:

The abc.ABCMeta IS "pythonic" interface in python

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X