Цель интерфейсов Zope?

Я начал использовать интерфейсы Zope в своем коде, и на данный момент, они - действительно только документация. Я использую их для определения то, что приписывает класс, должен обладать, явно реализовать их в соответствующих классах и явно проверить на них, где я ожидаю тот. Это прекрасно, но я хотел бы, чтобы они сделали больше, если это возможно, такой, поскольку на самом деле проверяют, что класс реализовал интерфейс, вместо того, чтобы просто проверить, что я сказал, что класс реализует интерфейс. Я считал zope Wiki пару раз, но все еще не вижу намного больше использования для интерфейсов, чем, что я в настоящее время делаю. Так, мой вопрос - то, что еще можно использовать эти интерфейсы для, и как Вы используете их для больше.

34
задан Martijn Pieters 23 August 2012 в 17:06
поделиться

3 ответа

Фактически вы можете проверить, реализует ли ваш объект или класс ваш интерфейс. Для этого вы можете использовать модуль verify (вы обычно используете его в своих тестах):

>>> from zope.interface import Interface, Attribute, implements
>>> class IFoo(Interface):
...     x = Attribute("The X attribute")
...     y = Attribute("The Y attribute")

>>> class Foo(object):
...     implements(IFoo)
...     x = 1
...     def __init__(self):
...         self.y = 2

>>> from zope.interface.verify import verifyObject
>>> verifyObject(IFoo, Foo())
True

>>> from zope.interface.verify import verifyClass
>>> verifyClass(IFoo, Foo)
True

Интерфейсы также могут использоваться для установки и тестирования инвариантов. Вы можете дополнительную информацию можно найти здесь:

http://www.muthukadan.net/docs/zca.html#interfaces

23
ответ дан 27 November 2019 в 16:11
поделиться

Я никогда не использовал интерфейсы Zope, но вы можете написать метакласс , который при проверках инициализации члены класса по отношению к интерфейсу и вызывает исключение времени выполнения, если метод не реализован.

С Python у вас нет других вариантов. Либо используйте этап «компиляции», на котором проверяется ваш код, либо динамически проверяйте его во время выполнения.

2
ответ дан 27 November 2019 в 16:11
поделиться

Интерфейсы Zope могут предоставить полезный способ разделения двух частей кода, которые не должны зависеть друг от друга.

Допустим, у нас есть компонент, который умеет печатать приветствие в модуле a.py:

>>> class Greeter(object):
...     def greet(self):
...         print 'Hello'

И некоторый код, который должен напечатать приветствие в модуле b.py:

>>> Greeter().greet()
'Hello'

. Такая компоновка затрудняет замену кода, который обрабатывает приветствие, не касаясь b.py (который может быть распределен в отдельном упаковка). Вместо этого мы могли бы ввести третий модуль c.py, который определяет интерфейс IGreeter:

>>> from zope.interface import Interface
>>> class IGreeter(Interface):
...     def greet():
...         """ Gives a greeting. """

Теперь мы можем использовать его для разделения a.py и b.py. Вместо того, чтобы создавать экземпляр класса Greeter, b.py теперь будет запрашивать утилиту, предоставляющую интерфейс IGreeter. И a.py объявит, что класс Greeter реализует этот интерфейс:

(a.py)
>>> from zope.interface import implementer
>>> from zope.component import provideUtility
>>> from c import IGreeter

>>> @implementer(IGreeter)
... class Greeter(object):
...     def greet(self):
...         print 'Hello'
>>> provideUtility(Greeter(), IGreeter)

(b.py)
>>> from zope.component import getUtility
>>> from c import IGreeter

>>> greeter = getUtility(IGreeter)
>>> greeter.greet()
'Hello'
19
ответ дан 27 November 2019 в 16:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: