ilnur
Июль 1, 2013 16:30:11
подскажите, что такое интерфейс в питоне.
Абстрактный класс, по аналогии с джанговскими моделями, я примерно понимаю.
Что они как бы нужны для дальнейшего его наследования.
А интерфейс?
Это же такой же класс или как?
Заранее спасибо.
Паралельно гуглю. Читаю. Но хочется почитать мысли из первых уст.
Спасибо
FishHook
Июль 1, 2013 17:04:37
Интерфейсов в питоне нет. Если сильно хочется, то можно эмулировать нечто похожее, в таких библиотеках, как zca, pca и прочих компонентных архитектурах это реализуется. Вопрос в полезности. В языках java и с# интерфейсы нужны, необходимость их применения обусловлена строгой статической типизацией и отсутствием множественного наследования. В питоне нет таких ограничений. С другой стороны, средства разработки, типа вижуал студии конкретно упрощают кодинг автоматически реализуя интерфейсы, отчего интерфейсный ООП становится удобным. У питона своя идеалогия, ИМХО интерфейсы тут нафиг не нужны.
bismigalis
Июль 1, 2013 18:49:33
интерфейсы нужны когда хочется единообразно обращаться с объектами принадлежащих разным классам
Shaman
Июль 1, 2013 19:23:46
Интерфейсы в питоне есть. В виде соглашений.
Lexander
Июль 1, 2013 20:01:59
Разве?
Помнится давным давно, в начале 2000-х, от интерфейсов отказались.
В Питоне есть миксины, выполняющие ту же роль.
ЗЫ
Interface есть в zope, но…
ilnur
Июль 2, 2013 06:37:48
просто паралельно учу java. И там увидел интерфейсы. Что их наследуют в классах, добавляя какую то функциональность классу. Если правильно понял.
По аналогии в питоне же можно написать какойто класс, определить какието методы в нем. И унаследоваться от него. И будет тоже самое. Нет?
FishHook
Июль 2, 2013 07:59:54
ilnur,
джава - строготипизированный язык. Предположим, тебе нужно держать некий набор объектов в коллекции. Ты обязан указать тип элементов коллекции
List<String> ls=new ArrayList<String>();
Теперь допустим, что у тебя есть два класса, которые никак друг от друга не наследуются, не имеют общего предка, но имеют одинаково названный метод, который принимает одинаковые значения и возвращает одинаковый результат. Например это Save(). Он ничего не принимает и не возвращает. Он может быть членом совершенно разных классов и делать совершенно разные вещи. Для объектов класса А происходит построение запроса к БД, для объектов класса В - строится XML, и т.д. Тебе хочется запихать объекты этих типов в коллекцию, чтобы можно было легко сохранить все инстансы в цикле, вызвав у них метод Save(). Но, в коллекцию нельзя поместить объекты разных типов. Можно привести все объекты к базовому типу object, но тогда они “потеряют” метод Save(). Выход - использование интерфейсов. Наследуя классы А и В от интерфейса ISaveble ты гарантируешь наличие метода Save у объектов этих классов и поэтому можешь запихать их в одну коллекцию
и вызвать Save() в цикле.
ilnur
Июль 2, 2013 08:17:53
FishHook
спасибо за понятный ответ.
интерфейс. это некий класс, с описанием своих методов. Так?
в питоне же можно создать класс. Вставить туда пустые методы. и не получится ли это интерфейсом?
Отнаследовавшись от этого класса-интерфесйса. Соответственно переопределить эти методы.
и будет то-же самое, нет?
FishHook
Июль 2, 2013 08:35:19
Нет, дело в том, что интерфейс обязует программиста реализовать контракт. То есть если ты отнаследуешься от интерфейса ISaveble, в котором как ты верно заметил дается только описание сигнатур методов, но не реализация, то ты обязан реализоваить метод Save() в классе иначе программа не скомпилируется. Таким образом собственно и достигается гарантия того, что объекты классов -наследников интерфейса будут содержать некоторые атрибуты с одинаковыми сигнатурами.
lorien
Июль 2, 2013 08:43:42
В питоне тоже есть такая штука в модуле 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 в классе-наследнике.