在Zope接口中声明类方法

时间:2014-01-14 10:04:59

标签: python interface zope

考虑如下类:

from zope.interface import implementer

@implementer(IMessage)
class Foo:

  @classmethod
  def parse(Klass, msg):
  """
  Parses `msg` into an instance of :class:`Foo`.

  :returns obj -- An instance of :class:`Foo`.
  """

如何在Zope接口IMessage中指定类方法?

在Zope界面中使用@classmethod装饰器会导致

zope.interface.exceptions.InvalidInterface: Concrete attribute, parse

1 个答案:

答案 0 :(得分:1)

Zope接口不关心类方法;它们仅指定特定接口必须实现的API。请注意,例如,您指定方法而不是 self参数。这样,您可以按照自己喜欢的方式实现接口,包括在模块中使用常规函数!

如果实现选择使该可调用classmethod完全在接口范围之外。接口只关心访问接口提供程序时使用的API;如果一个实例有一个可调用的,那么最终用户不应该关心它是否是一个类方法。

如果类方法应该直接在类上可用,那么这就是必须提供的接口;我们在这里称它为工厂界面:

class IMessageFactory(Interface):
     def __call__():
         """Produce an IMessage provider"""

     def parse(msg):
         """Parses `msg` into a IMessage provider"""


class IMessage(Interface):
     """A message interface"""

     # Optional, show the class method here too
     def parse(msg):
         """Parses `msg` into a IFoo provider"""

您的Foo类直接提供IMessageFactory,并实现IMessage接口(以便它的实例提供它)。