Разница между абстрактным классом и интерфейсом в Python

Причина в том, что readObject () в ObjectInputStream практически реализуется как:

 String s = readClassName();
 Class c = Class.forName(s); // Here your code breaks
 Object o = c.newInstance();
 ...populate o...
510
задан Casebash 21 March 2010 в 10:45
поделиться

4 ответа

Что Вы будете видеть, иногда следующее:

class Abstract1( object ):
    """Some description that tells you it's abstract,
    often listing the methods you're expected to supply."""
    def aMethod( self ):
        raise NotImplementedError( "Should have implemented this" )

, поскольку Python не имеет (и не нуждается) формальный Интерфейсный контракт, различие стиля Java между абстракцией и интерфейсом не существуют. Если кто-то пройдет усилие определить формальный интерфейс, это также будет абстрактный класс. Единственные различия были бы в установленном намерении в docstring.

И различие между кратким обзором и интерфейсом незначительная вещь, когда у Вас есть утиный ввод.

Java использует интерфейсы, потому что он не имеет множественного наследования.

, поскольку Python имеет множественное наследование, можно также видеть что-то вроде этого

class SomeAbstraction( object ):
    pass # lots of stuff - but missing something

class Mixin1( object ):
    def something( self ):
        pass # one implementation

class Mixin2( object ):
    def something( self ):
        pass # another

class Concrete1( SomeAbstraction, Mixin1 ):
    pass

class Concrete2( SomeAbstraction, Mixin2 ):
    pass

, Это использует своего рода абстрактный суперкласс с mixins для создания конкретных подклассов, которые являются непересекающимися.

576
ответ дан S.Lott 21 March 2010 в 10:45
поделиться

Python> = 2.6 имеет Абстрактные базовые классы .

Абстрактные базовые классы (сократил ABC), дополнительный ввод утки, позволяя определять интерфейсы, когда другие методы как hasattr () будут неуклюжи. Python идет со многими встроенными ABC для структур данных (в модуле наборов), числа (в модуле чисел), и потоки (в io модуле). Можно создать собственную ABC с модулем abc.

существует также Интерфейс Zope модуль, который используется проектами за пределами zope, как скрученный. Я не действительно знаком с ним, но существует страница Wiki здесь , который мог бы помочь.

В целом, Вам не нужно понятие абстрактных классов, или интерфейсы в Python (отредактированный - см. ответ S.Lott для деталей).

99
ответ дан Chris 21 March 2010 в 10:45
поделиться

Python действительно не имеет ни одного понятия.

Это использует утиный ввод, который устранил необходимость интерфейсов (по крайней мере, для компьютера:-))

Python < = 2.5: Базовые классы, очевидно, существуют, но нет никакого явного способа отметить метод как 'чистый виртуальный', таким образом, класс не действительно абстрактен.

Python> = 2.6: Абстрактные базовые классы делают , существуют ( http://docs.python.org/library/abc.html ). И позвольте Вам определять методы, которые должны быть реализованы в подклассах. Я не очень люблю синтаксис, но функция там. Большую часть времени, вероятно, лучше использовать утиный ввод от стороны клиента 'использования'.

37
ответ дан Douglas Leeder 21 March 2010 в 10:45
поделиться

В целом интерфейсы используются только на языках, которые используют модель класса единичного наследования. На этих языках единичного наследования обычно используются интерфейсы, если какой-либо класс мог бы использовать конкретный метод или набор методов. Также на этих языках единичного наследования, абстрактные классы используются, чтобы или определить переменные класса в дополнение ни к одному или большему количеству методов, или использовать модель единичного наследования для ограничения диапазона классов, которые могли использовать ряд методов.

Языки, которые поддерживают модель множественного наследования, имеют тенденцию использовать только классы или абстрактные базовые классы и не интерфейсы. Так как Python поддерживает множественное наследование, он не использует интерфейсы, и Вы хотели бы использовать базовые классы или абстрактные базовые классы.

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

15
ответ дан Lara Dougan 21 March 2010 в 10:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: