Форум сайта python.su
0
Привет всем! Python изучаю очень недавно, т.к. потребовалось реализовать один функционал и потребовалось сделать это очень срочно, поэтому хочу задать детский вопрос, т.к. времени искать ответ в документации, к сожалению, нет.
И так, есть ли в Python программные интерфейсы? Я лет пять писал на Delphi, потом ушел на Java/C#, где всегда они были (имеется ввиду, что можно было создать интерфейс и унаследовать от него класс, переопределив методы интерфейса, а потом обращаться к этому классу, как к экземпляру интерфейса). Их отсутствие в Python вызвало у меня легкое замешательство и недоумение, поэтому я здесь.
Честно говоря, я слабо верю в то, что отсутствуют механизмы, которые несут аналогичный функционал. Не могли бы вы мне объяснить: все же есть ли интерфейсы (и если да, то где про них читать), либо показать на примере, как воспользоваться каким-нибудь их заменителем.
Заранее спасибо!
Офлайн
3
Интерфейсов на уровне языка нет, но есть реализация интерфейсов - библиотека zope.interface: http://pypi.python.org/pypi/zope.interface
Офлайн
2
slavkaВам какое свойство интерфейса интересно?
Честно говоря, я слабо верю в то, что отсутствуют механизмы, которые несут аналогичный функционал. Не могли бы вы мне объяснить: все же есть ли интерфейсы (и если да, то где про них читать), либо показать на примере, как воспользоваться каким-нибудь их заменителем.
Офлайн
0
Утиная типизация делает ненужными интерфейсы, ибо даёт большую гибкость.
class A:
def method(self):
print 'A'
class B:
def method(self):
print 'B'
for obj in [A(), B()]:
obj.method()
Офлайн
3
Kogromme пошел вырезать куклу и тыкать в нее иголками…
А интерфейс в голове разработчика…
Офлайн
14
Та да. Утиная типизация при всех ее достоинствах не заменяет понятие “public interface”.
Или вы весь ваш код очень хорошо документируете?
Офлайн
0
Андрей СветловДумаю, я немного погорячился с “делает ненужным”. Зависит от области в которой используется иерархия классов. Если применение локальное (например, делаем fake-объект для юнит-тестов), то вполне пойдёт утиная типизация. Если надо приблизиться к статической типизации, можно использовать что-то типа:
Та да. Утиная типизация при всех ее достоинствах не заменяет понятие “public interface”.
Или вы весь ваш код очень хорошо документируете?
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()
Офлайн
3
Kogrom, посмотрите на фреймворки Zope3, bluebream, pyramid, там нехилое такое применение интерфейсов (ZCA) много для чего, в том числе, как уже упоминалось, для документации.
Офлайн
14
abc дает хорошее описание public api.
zope возникла гораздо раньше, когда abc еще не было (и всё же мне zope.interface как-то привычней).
Главная фишка zope.interface - именно адаптеры. Мощь IMyIFace(anything) не бросается в глаза - а потом от нее нелегко отказаться.
Офлайн
0
regallВозьму на заметку. Но в любом случае, без рассмотрения утиной типизации и abc - это прыжок через 3 ступеньки.
Kogrom, посмотрите на фреймворки Zope3, bluebream, pyramid, там нехилое такое применение интерфейсов (ZCA) много для чего, в том числе, как уже упоминалось, для документации.
Офлайн