slavka
Фев. 9, 2011 14:38:57
Привет всем! Python изучаю очень недавно, т.к. потребовалось реализовать один функционал и потребовалось сделать это очень срочно, поэтому хочу задать детский вопрос, т.к. времени искать ответ в документации, к сожалению, нет.
И так, есть ли в Python программные интерфейсы? Я лет пять писал на Delphi, потом ушел на Java/C#, где всегда они были (имеется ввиду, что можно было создать интерфейс и унаследовать от него класс, переопределив методы интерфейса, а потом обращаться к этому классу, как к экземпляру интерфейса). Их отсутствие в Python вызвало у меня легкое замешательство и недоумение, поэтому я здесь.
Честно говоря, я слабо верю в то, что отсутствуют механизмы, которые несут аналогичный функционал. Не могли бы вы мне объяснить: все же есть ли интерфейсы (и если да, то где про них читать), либо показать на примере, как воспользоваться каким-нибудь их заменителем.
Заранее спасибо!
regall
Фев. 9, 2011 14:47:26
Интерфейсов на уровне языка нет, но есть реализация интерфейсов - библиотека zope.interface:
http://pypi.python.org/pypi/zope.interface
Александр Кошелев
Фев. 9, 2011 15:00:23
slavka
Честно говоря, я слабо верю в то, что отсутствуют механизмы, которые несут аналогичный функционал. Не могли бы вы мне объяснить: все же есть ли интерфейсы (и если да, то где про них читать), либо показать на примере, как воспользоваться каким-нибудь их заменителем.
Вам какое свойство интерфейса интересно?
Kogrom
Фев. 9, 2011 17:13:15
Утиная типизация делает ненужными интерфейсы, ибо даёт большую гибкость.
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
regall
Фев. 9, 2011 18:16:06
Kogrom
А интерфейс в голове разработчика…
me пошел вырезать куклу и тыкать в нее иголками…
Андрей Светлов
Фев. 9, 2011 18:46:56
Та да. Утиная типизация при всех ее достоинствах не заменяет понятие “public interface”.
Или вы весь ваш код очень хорошо документируете?
Kogrom
Фев. 9, 2011 21:36:13
Андрей Светлов
Та да. Утиная типизация при всех ее достоинствах не заменяет понятие “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()
Как-то так.
regall
Фев. 9, 2011 22:15:22
Kogrom, посмотрите на фреймворки Zope3, bluebream, pyramid, там нехилое такое применение интерфейсов (ZCA) много для чего, в том числе, как уже упоминалось, для документации.
Андрей Светлов
Фев. 9, 2011 22:27:14
abc дает хорошее описание public api.
zope возникла гораздо раньше, когда abc еще не было (и всё же мне zope.interface как-то привычней).
Главная фишка zope.interface - именно адаптеры. Мощь IMyIFace(anything) не бросается в глаза - а потом от нее нелегко отказаться.
Kogrom
Фев. 9, 2011 22:46:53
regall
Kogrom, посмотрите на фреймворки Zope3, bluebream, pyramid, там нехилое такое применение интерфейсов (ZCA) много для чего, в том числе, как уже упоминалось, для документации.
Возьму на заметку. Но в любом случае, без рассмотрения утиной типизации и abc - это прыжок через 3 ступеньки.