2011-07-24 165 views
2

我试图理解Zope接口是如何工作的。我知道Interface只是一个InterfaceClass的实例,它只是一个普通的类。但是如果Interface只是一个类实例,为什么它可以被用作基类来继承?如何实现Zope接口?

例如 Class IFoo(接口): pass

您能否给我一些见解?谢谢。

回答

3

Python是固有地有弹性,并且任何对象可以是一个基类,只要其看起来像基类。和Python一样,这意味着实现一些预期可以在Python类中找到的属性。

接口类(或它的基础规范和元素)设置几个。寻找以双下划线(__)开始获得的理解的任何变量:

  • __module__:包含蟒路径组件串。

  • __name__:定义该类的名称。

  • __bases__:该类的基类。

  • __doc__ :(可选)该类的文档字符串。

另外,InterfaceClass __init__方法在用作基类时会被调用; Python基本上将基类视为元类,并且只要我们在类定义中使用基类的类(metaclass),就会创建一个新的实例。这意味着__init__方法将通过新的__name____bases__值,以及所有新的类属性作为关键字参数(包括__module__和可选的__doc__)。

这是在所有Standard type hierarchy section of the Python Data Model document记载(寻找在特殊属性“类”段),并且在the same document, in the Customizing class creation section(具有__class__属性基类被认为是一个类型)。

所以,任何 Python实例,其限定至少__module____name____bases__属性,和一个合适的方法__init__将用作其他类的基类。其余的是Python。

+0

在Zope的接口的实现,存在的代码的行: 接口= InterfaceClass( “接口”,__module__ = 'zope.interface') 凡InterfaceClass是一个普通的类。 – Zidadi

+0

@Zidadi你很正确,我的回答是错误的,我会看到你得到一个正确的答案。 –

+0

@Zidadi更新了解释InterfaceClass是如何构成元类的。 –