我个人将接口与Zope组件体系结构(ZCA)结合使用。优点不在于具有接口,而是能够将它们与适配器和实用程序(单例)结合使用。
例如你可以创建一个适配器,它可以接受一个实现ISomething的类,但将它适配到一些接口ISomethingElse。基本上它是一个包装。
原始类将是:
class MyClass(object):
implements(ISomething)
def do_something(self):
return "foo"
然后想象接口ISomethingElse有一个方法do_something_else的()。适配器可能看起来像这样:
class SomethingElseAdapter(object):
implements(ISomethingElse)
adapts(ISomething)
def __init__(self, context):
self.context = context
def do_something_else():
return self.context.do_something()+"bar"
然后,您将注册与组件注册该适配器,然后你可以使用这样的:
>>> obj = MyClass()
>>> print obj.do_something()
"foo"
>>> adapter = ISomethingElse(obj)
>>> print adapter.do_something_else()
"foobar"
什么,让你的扩展能力具有该类不直接提供的功能的原始类。您可以在不更改该类的情况下(可能位于不同的产品/库中)执行该操作,而只需通过不同的实现交换该适配器,而无需更改使用该代码的代码。这一切都是通过在初始化时注册组件来完成的。
这当然主要用于框架/库。
我认为需要一段时间才能习惯它,但我真的不想再没有它了。但正如之前所说的那样,你也需要确切地思考它在哪里有意义,哪里没有意义。当然,它自己的接口也可以用作API的文档。这对单元测试也很有用,您可以测试您的类是否实际实现了该接口。最后但并非最不重要的,我喜欢通过编写接口和一些doctests来开始实现我实际要编码的内容。
欲了解更多信息,你可以看看我的little introduction to it,有一个quite extensive description of it's API。
“要求将该方法重写为被调用”:但您可以调用ISomething()。some_other_method() – Miles 2009-02-16 02:32:21
对我来说,这看起来不太Python。 – 2009-02-16 03:58:40