考虑如下类:
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
答案 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
接口(以便它的实例提供它)。