Найти - Пользователи
Полная версия: интерфейсы и абстрактные классы в питоне
Начало » Python для новичков » интерфейсы и абстрактные классы в питоне
1 2
ilnur
подскажите, что такое интерфейс в питоне.
Абстрактный класс, по аналогии с джанговскими моделями, я примерно понимаю.
Что они как бы нужны для дальнейшего его наследования.
А интерфейс?
Это же такой же класс или как?

Заранее спасибо.
Паралельно гуглю. Читаю. Но хочется почитать мысли из первых уст.
Спасибо
FishHook
Интерфейсов в питоне нет. Если сильно хочется, то можно эмулировать нечто похожее, в таких библиотеках, как zca, pca и прочих компонентных архитектурах это реализуется. Вопрос в полезности. В языках java и с# интерфейсы нужны, необходимость их применения обусловлена строгой статической типизацией и отсутствием множественного наследования. В питоне нет таких ограничений. С другой стороны, средства разработки, типа вижуал студии конкретно упрощают кодинг автоматически реализуя интерфейсы, отчего интерфейсный ООП становится удобным. У питона своя идеалогия, ИМХО интерфейсы тут нафиг не нужны.
bismigalis
интерфейсы нужны когда хочется единообразно обращаться с объектами принадлежащих разным классам
Shaman
Интерфейсы в питоне есть. В виде соглашений.
Lexander
Разве?
Помнится давным давно, в начале 2000-х, от интерфейсов отказались.
В Питоне есть миксины, выполняющие ту же роль.

ЗЫ
Interface есть в zope, но…
ilnur
просто паралельно учу java. И там увидел интерфейсы. Что их наследуют в классах, добавляя какую то функциональность классу. Если правильно понял.
По аналогии в питоне же можно написать какойто класс, определить какието методы в нем. И унаследоваться от него. И будет тоже самое. Нет?
FishHook
ilnur,
джава - строготипизированный язык. Предположим, тебе нужно держать некий набор объектов в коллекции. Ты обязан указать тип элементов коллекции
List<String> ls=new ArrayList<String>();
Теперь допустим, что у тебя есть два класса, которые никак друг от друга не наследуются, не имеют общего предка, но имеют одинаково названный метод, который принимает одинаковые значения и возвращает одинаковый результат. Например это Save(). Он ничего не принимает и не возвращает. Он может быть членом совершенно разных классов и делать совершенно разные вещи. Для объектов класса А происходит построение запроса к БД, для объектов класса В - строится XML, и т.д. Тебе хочется запихать объекты этих типов в коллекцию, чтобы можно было легко сохранить все инстансы в цикле, вызвав у них метод Save(). Но, в коллекцию нельзя поместить объекты разных типов. Можно привести все объекты к базовому типу object, но тогда они “потеряют” метод Save(). Выход - использование интерфейсов. Наследуя классы А и В от интерфейса ISaveble ты гарантируешь наличие метода Save у объектов этих классов и поэтому можешь запихать их в одну коллекцию
List<ISaveble> ls;
и вызвать Save() в цикле.
ilnur
FishHook
спасибо за понятный ответ.

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


FishHook
Нет, дело в том, что интерфейс обязует программиста реализовать контракт. То есть если ты отнаследуешься от интерфейса ISaveble, в котором как ты верно заметил дается только описание сигнатур методов, но не реализация, то ты обязан реализоваить метод Save() в классе иначе программа не скомпилируется. Таким образом собственно и достигается гарантия того, что объекты классов -наследников интерфейса будут содержать некоторые атрибуты с одинаковыми сигнатурами.
lorien
В питоне тоже есть такая штука в модуле abc: http://docs.python.org/2/library/abc.html#abc.abstractmethod

Например, создаём класс RunnerInterface::

from abc import ABCMeta, abstractmethod
class RunnerInterface(object):
    __metaclass__ = ABCMeta
    @abstractmethod
    def run(self):
        pass

Теперь, если мы унаследуемся от RunnerInterface, мы будем обязаны переопределить метод run в классе-наследнике.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB