Причина в том, что readObject () в ObjectInputStream практически реализуется как:
String s = readClassName();
Class c = Class.forName(s); // Here your code breaks
Object o = c.newInstance();
...populate o...
Что Вы будете видеть, иногда следующее:
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 для создания конкретных подклассов, которые являются непересекающимися.
Python> = 2.6 имеет Абстрактные базовые классы .
Абстрактные базовые классы (сократил ABC), дополнительный ввод утки, позволяя определять интерфейсы, когда другие методы как hasattr () будут неуклюжи. Python идет со многими встроенными ABC для структур данных (в модуле наборов), числа (в модуле чисел), и потоки (в io модуле). Можно создать собственную ABC с модулем abc.
существует также Интерфейс Zope модуль, который используется проектами за пределами zope, как скрученный. Я не действительно знаком с ним, но существует страница Wiki здесь , который мог бы помочь.
В целом, Вам не нужно понятие абстрактных классов, или интерфейсы в Python (отредактированный - см. ответ S.Lott для деталей).
Python действительно не имеет ни одного понятия.
Это использует утиный ввод, который устранил необходимость интерфейсов (по крайней мере, для компьютера:-))
Python < = 2.5: Базовые классы, очевидно, существуют, но нет никакого явного способа отметить метод как 'чистый виртуальный', таким образом, класс не действительно абстрактен.
Python> = 2.6: Абстрактные базовые классы делают , существуют ( http://docs.python.org/library/abc.html ). И позвольте Вам определять методы, которые должны быть реализованы в подклассах. Я не очень люблю синтаксис, но функция там. Большую часть времени, вероятно, лучше использовать утиный ввод от стороны клиента 'использования'.
В целом интерфейсы используются только на языках, которые используют модель класса единичного наследования. На этих языках единичного наследования обычно используются интерфейсы, если какой-либо класс мог бы использовать конкретный метод или набор методов. Также на этих языках единичного наследования, абстрактные классы используются, чтобы или определить переменные класса в дополнение ни к одному или большему количеству методов, или использовать модель единичного наследования для ограничения диапазона классов, которые могли использовать ряд методов.
Языки, которые поддерживают модель множественного наследования, имеют тенденцию использовать только классы или абстрактные базовые классы и не интерфейсы. Так как Python поддерживает множественное наследование, он не использует интерфейсы, и Вы хотели бы использовать базовые классы или абстрактные базовые классы.