因此,我在静态土地上花了大量时间后开始使用Python.我已经看到一些项目使得"接口"实际上只是没有任何实现的类.之前,我嘲笑这个想法,忽略那些项目的那一部分.但现在,我开始热衷于这个想法了.
我们很清楚,Python中的界面看起来像这样:
class ISomething(object): def some_method(): pass def some_other_method(some_argument): pass
请注意,您没有将self传递给任何方法,因此要求重写该方法以进行调用.我认为这是一种很好的文档和完整性测试形式.
那么每个人对这个想法的看法是什么?我做过的所有C#编程都被洗脑了,还是这个好主意?
我不确定这是什么意思.接口(无论如何这种形式)主要是为了解决缺少多重继承的问题.但是Python有MI,所以为什么不做一个抽象类呢?
class Something(object): def some_method(self): raise NotImplementedError() def some_other_method(self, some_argument): raise NotImplementedError()
在Python 2.6及更高版本中,您可以使用抽象基类.这些是有用的,因为您可以通过使用"isinstance"来测试是否某些东西实现了给定的ABC.像往常一样,Python中的概念并不像严格的语言那样严格执行,但它很方便.此外,还有一些很好的惯用方法可以使用装饰器声明抽象方法 - 请参阅上面的链接以获取示例.
在某些情况下,接口可以非常方便. 扭曲使得相当广泛使用的Zope的接口,并在一个项目我工作的Zope接口的工作非常出色.Enthought的特性包装最近添加了接口,但我对它们没有任何经验.
请注意过度使用 - 鸭子类型和协议是Python的一个基本方面,只有在绝对必要的情况下才使用接口.
pythonic方式是"请求宽恕而不是获得许可".接口是所有有关接收到的权限对象上执行一些操作.Python更喜欢这个:
def quacker(duck): try: duck.quack(): except AttributeError: raise ThisAintADuckException
我认为接口不会在代码环境中添加任何内容.
方法定义强制执行没有它们.如果一个对象预计会有喜欢Foo
并且有方法bar()
,那么它就会抛出一个AttributeError
.
只需确保定义接口方法并不能保证其正确性; 无论如何,行为单元测试需要到位.
编写一个"读这个或死"的页面同样有效,描述了你的对象需要与你所插入的内容兼容的方法,因为你在接口类中有详细的文档字符串,因为你可能会有无论如何都要测试它.其中一个测试可以是所有兼容对象的标准,它将检查每个基本方法的调用和返回类型.
看起来对我来说是不必要的 - 当我正在编写这样的类时,我通常只ISomething
用无方法创建基类(你的),并在实际文档中提到子类应该覆盖哪些方法.