Найти - Пользователи
Полная версия: Программные интерфейсы в Python.
Начало » Python для новичков » Программные интерфейсы в Python.
1 2 3 4
slavka
Привет всем! Python изучаю очень недавно, т.к. потребовалось реализовать один функционал и потребовалось сделать это очень срочно, поэтому хочу задать детский вопрос, т.к. времени искать ответ в документации, к сожалению, нет.

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

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

Заранее спасибо!
regall
Интерфейсов на уровне языка нет, но есть реализация интерфейсов - библиотека zope.interface: http://pypi.python.org/pypi/zope.interface
Александр Кошелев
slavka
Честно говоря, я слабо верю в то, что отсутствуют механизмы, которые несут аналогичный функционал. Не могли бы вы мне объяснить: все же есть ли интерфейсы (и если да, то где про них читать), либо показать на примере, как воспользоваться каким-нибудь их заменителем.
Вам какое свойство интерфейса интересно?
Kogrom
Утиная типизация делает ненужными интерфейсы, ибо даёт большую гибкость.
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
Kogrom
А интерфейс в голове разработчика…
me пошел вырезать куклу и тыкать в нее иголками…
Андрей Светлов
Та да. Утиная типизация при всех ее достоинствах не заменяет понятие “public interface”.
Или вы весь ваш код очень хорошо документируете?
Kogrom
Андрей Светлов
Та да. Утиная типизация при всех ее достоинствах не заменяет понятие “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
Kogrom, посмотрите на фреймворки Zope3, bluebream, pyramid, там нехилое такое применение интерфейсов (ZCA) много для чего, в том числе, как уже упоминалось, для документации.
Андрей Светлов
abc дает хорошее описание public api.
zope возникла гораздо раньше, когда abc еще не было (и всё же мне zope.interface как-то привычней).
Главная фишка zope.interface - именно адаптеры. Мощь IMyIFace(anything) не бросается в глаза - а потом от нее нелегко отказаться.
Kogrom
regall
Kogrom, посмотрите на фреймворки Zope3, bluebream, pyramid, там нехилое такое применение интерфейсов (ZCA) много для чего, в том числе, как уже упоминалось, для документации.
Возьму на заметку. Но в любом случае, без рассмотрения утиной типизации и abc - это прыжок через 3 ступеньки.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB