Уведомления

Группа в Telegram: @pythonsu

#1 Июль 1, 2013 16:30:11

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

интерфейсы и абстрактные классы в питоне

подскажите, что такое интерфейс в питоне.
Абстрактный класс, по аналогии с джанговскими моделями, я примерно понимаю.
Что они как бы нужны для дальнейшего его наследования.
А интерфейс?
Это же такой же класс или как?

Заранее спасибо.
Паралельно гуглю. Читаю. Но хочется почитать мысли из первых уст.
Спасибо

Офлайн

#2 Июль 1, 2013 17:04:37

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

интерфейсы и абстрактные классы в питоне

Интерфейсов в питоне нет. Если сильно хочется, то можно эмулировать нечто похожее, в таких библиотеках, как zca, pca и прочих компонентных архитектурах это реализуется. Вопрос в полезности. В языках java и с# интерфейсы нужны, необходимость их применения обусловлена строгой статической типизацией и отсутствием множественного наследования. В питоне нет таких ограничений. С другой стороны, средства разработки, типа вижуал студии конкретно упрощают кодинг автоматически реализуя интерфейсы, отчего интерфейсный ООП становится удобным. У питона своя идеалогия, ИМХО интерфейсы тут нафиг не нужны.



Офлайн

#3 Июль 1, 2013 18:49:33

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

интерфейсы и абстрактные классы в питоне

интерфейсы нужны когда хочется единообразно обращаться с объектами принадлежащих разным классам

Офлайн

#4 Июль 1, 2013 19:23:46

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

интерфейсы и абстрактные классы в питоне

Интерфейсы в питоне есть. В виде соглашений.

Офлайн

#5 Июль 1, 2013 20:01:59

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

интерфейсы и абстрактные классы в питоне

Разве?
Помнится давным давно, в начале 2000-х, от интерфейсов отказались.
В Питоне есть миксины, выполняющие ту же роль.

ЗЫ
Interface есть в zope, но…



Офлайн

#6 Июль 2, 2013 06:37:48

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

интерфейсы и абстрактные классы в питоне

просто паралельно учу java. И там увидел интерфейсы. Что их наследуют в классах, добавляя какую то функциональность классу. Если правильно понял.
По аналогии в питоне же можно написать какойто класс, определить какието методы в нем. И унаследоваться от него. И будет тоже самое. Нет?

Офлайн

#7 Июль 2, 2013 07:59:54

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

интерфейсы и абстрактные классы в питоне

ilnur,
джава - строготипизированный язык. Предположим, тебе нужно держать некий набор объектов в коллекции. Ты обязан указать тип элементов коллекции

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



Офлайн

#8 Июль 2, 2013 08:17:53

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

интерфейсы и абстрактные классы в питоне

FishHook
спасибо за понятный ответ.

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


Офлайн

#9 Июль 2, 2013 08:35:19

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

интерфейсы и абстрактные классы в питоне

Нет, дело в том, что интерфейс обязует программиста реализовать контракт. То есть если ты отнаследуешься от интерфейса ISaveble, в котором как ты верно заметил дается только описание сигнатур методов, но не реализация, то ты обязан реализоваить метод Save() в классе иначе программа не скомпилируется. Таким образом собственно и достигается гарантия того, что объекты классов -наследников интерфейса будут содержать некоторые атрибуты с одинаковыми сигнатурами.



Офлайн

#10 Июль 2, 2013 08:43:42

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

интерфейсы и абстрактные классы в питоне

В питоне тоже есть такая штука в модуле 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 в классе-наследнике.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version