Форум сайта python.su
22
подскажите, что такое интерфейс в питоне.
Абстрактный класс, по аналогии с джанговскими моделями, я примерно понимаю.
Что они как бы нужны для дальнейшего его наследования.
А интерфейс?
Это же такой же класс или как?
Заранее спасибо.
Паралельно гуглю. Читаю. Но хочется почитать мысли из первых уст.
Спасибо
Офлайн
568
Интерфейсов в питоне нет. Если сильно хочется, то можно эмулировать нечто похожее, в таких библиотеках, как zca, pca и прочих компонентных архитектурах это реализуется. Вопрос в полезности. В языках java и с# интерфейсы нужны, необходимость их применения обусловлена строгой статической типизацией и отсутствием множественного наследования. В питоне нет таких ограничений. С другой стороны, средства разработки, типа вижуал студии конкретно упрощают кодинг автоматически реализуя интерфейсы, отчего интерфейсный ООП становится удобным. У питона своя идеалогия, ИМХО интерфейсы тут нафиг не нужны.
Офлайн
47
интерфейсы нужны когда хочется единообразно обращаться с объектами принадлежащих разным классам
Офлайн
88
Интерфейсы в питоне есть. В виде соглашений.
Офлайн
33
Разве?
Помнится давным давно, в начале 2000-х, от интерфейсов отказались.
В Питоне есть миксины, выполняющие ту же роль.
ЗЫ
Interface есть в zope, но…
Офлайн
22
просто паралельно учу java. И там увидел интерфейсы. Что их наследуют в классах, добавляя какую то функциональность классу. Если правильно понял.
По аналогии в питоне же можно написать какойто класс, определить какието методы в нем. И унаследоваться от него. И будет тоже самое. Нет?
Офлайн
568
ilnur,
джава - строготипизированный язык. Предположим, тебе нужно держать некий набор объектов в коллекции. Ты обязан указать тип элементов коллекции
List<String> ls=new ArrayList<String>();
List<ISaveble> ls;
Офлайн
22
FishHook
спасибо за понятный ответ.
интерфейс. это некий класс, с описанием своих методов. Так?
в питоне же можно создать класс. Вставить туда пустые методы. и не получится ли это интерфейсом?
Отнаследовавшись от этого класса-интерфесйса. Соответственно переопределить эти методы.
и будет то-же самое, нет?
Офлайн
568
Нет, дело в том, что интерфейс обязует программиста реализовать контракт. То есть если ты отнаследуешься от интерфейса ISaveble, в котором как ты верно заметил дается только описание сигнатур методов, но не реализация, то ты обязан реализоваить метод Save() в классе иначе программа не скомпилируется. Таким образом собственно и достигается гарантия того, что объекты классов -наследников интерфейса будут содержать некоторые атрибуты с одинаковыми сигнатурами.
Офлайн
В питоне тоже есть такая штука в модуле 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
Офлайн