Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 9, 2011 14:38:57

slavka
От:
Зарегистрирован: 2011-02-09
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Программные интерфейсы в Python.

Привет всем! Python изучаю очень недавно, т.к. потребовалось реализовать один функционал и потребовалось сделать это очень срочно, поэтому хочу задать детский вопрос, т.к. времени искать ответ в документации, к сожалению, нет.

И так, есть ли в Python программные интерфейсы? Я лет пять писал на Delphi, потом ушел на Java/C#, где всегда они были (имеется ввиду, что можно было создать интерфейс и унаследовать от него класс, переопределив методы интерфейса, а потом обращаться к этому классу, как к экземпляру интерфейса). Их отсутствие в Python вызвало у меня легкое замешательство и недоумение, поэтому я здесь.

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

Заранее спасибо!



Офлайн

#2 Фев. 9, 2011 14:47:26

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Программные интерфейсы в Python.

Интерфейсов на уровне языка нет, но есть реализация интерфейсов - библиотека zope.interface: http://pypi.python.org/pypi/zope.interface



Офлайн

#3 Фев. 9, 2011 15:00:23

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Программные интерфейсы в Python.

slavka
Честно говоря, я слабо верю в то, что отсутствуют механизмы, которые несут аналогичный функционал. Не могли бы вы мне объяснить: все же есть ли интерфейсы (и если да, то где про них читать), либо показать на примере, как воспользоваться каким-нибудь их заменителем.
Вам какое свойство интерфейса интересно?



Офлайн

#4 Фев. 9, 2011 17:13:15

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

Программные интерфейсы в Python.

Утиная типизация делает ненужными интерфейсы, ибо даёт большую гибкость.

class A:
def method(self):
print 'A'

class B:
def method(self):
print 'B'

for obj in [A(), B()]:
obj.method()
А интерфейс в голове разработчика…

Но всё-таки есть и что-то близкое интерфейсам:
http://docs.python.org/library/abc.html



Офлайн

#5 Фев. 9, 2011 18:16:06

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Программные интерфейсы в Python.

Kogrom
А интерфейс в голове разработчика…
me пошел вырезать куклу и тыкать в нее иголками…



Офлайн

#6 Фев. 9, 2011 18:46:56

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Программные интерфейсы в Python.

Та да. Утиная типизация при всех ее достоинствах не заменяет понятие “public interface”.
Или вы весь ваш код очень хорошо документируете?



Офлайн

#7 Фев. 9, 2011 21:36:13

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

Программные интерфейсы в Python.

Андрей Светлов
Та да. Утиная типизация при всех ее достоинствах не заменяет понятие “public interface”.
Или вы весь ваш код очень хорошо документируете?
Думаю, я немного погорячился с “делает ненужным”. Зависит от области в которой используется иерархия классов. Если применение локальное (например, делаем fake-объект для юнит-тестов), то вполне пойдёт утиная типизация. Если надо приблизиться к статической типизации, можно использовать что-то типа:

from abc import ABCMeta, abstractmethod

class A(object):
__metaclass__ = ABCMeta

@abstractmethod
def method(self): pass


class B(A):

def method(self):
print 'B'

class C(A):

def method(self):
print 'C'

class D:

def method(self):
print 'D'

for obj in [B(), C(), D()]:
if issubclass(type(obj), A):
obj.method()
Как-то так.



Офлайн

#8 Фев. 9, 2011 22:15:22

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Программные интерфейсы в Python.

Kogrom, посмотрите на фреймворки Zope3, bluebream, pyramid, там нехилое такое применение интерфейсов (ZCA) много для чего, в том числе, как уже упоминалось, для документации.



Офлайн

#9 Фев. 9, 2011 22:27:14

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Программные интерфейсы в Python.

abc дает хорошее описание public api.
zope возникла гораздо раньше, когда abc еще не было (и всё же мне zope.interface как-то привычней).
Главная фишка zope.interface - именно адаптеры. Мощь IMyIFace(anything) не бросается в глаза - а потом от нее нелегко отказаться.



Офлайн

#10 Фев. 9, 2011 22:46:53

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

Программные интерфейсы в Python.

regall
Kogrom, посмотрите на фреймворки Zope3, bluebream, pyramid, там нехилое такое применение интерфейсов (ZCA) много для чего, в том числе, как уже упоминалось, для документации.
Возьму на заметку. Но в любом случае, без рассмотрения утиной типизации и abc - это прыжок через 3 ступеньки.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version