【问题标题】:How Zope interface is implemented?Zope接口是如何实现的?
【发布时间】:2011-10-12 03:14:38
【问题描述】:

我试图了解 Zope 界面的工作原理。我知道接口只是接口类的一个实例,它只是一个普通的类。但是如果接口只是一个类实例,为什么它可以作为一个基类来继承呢?

例如 IFoo 类(接口): 通过

你能给我一些见解吗?谢谢你。

【问题讨论】:

    标签: python interface zope


    【解决方案1】:

    Python 天生灵活,任何 对象都可以是基类,只要它看起来 像基类。与 Python 的情况一样,这意味着实现一些预期会在 Python 类中找到的属性。

    接口类(或它的基础规范和元素)设置了几个。查找以双下划线 (__) 开头的任何变量集以了解:

    • __module__:包含python路径模块的字符串。

    • __name__:定义类的名称。

    • __bases__:这个类的基类。

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

    另外,InterfaceClass__init__作为基类使用时会调用方法; Python 基本上将基类视为元类,每当我们在类定义中使用它时,都会创建基类的类(元类)的新实例。这意味着__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__ 属性的基类被视为一种类型)。

    因此,任何至少定义了__module____name____bases__ 属性的python 实例,以及合适的__init__ 方法将作为其他类的基类。 Python 完成了剩下的工作。

    【讨论】:

    • 在Zope的接口实现中,有这么一行代码: Interface = InterfaceClass("Interface", module = 'zope.interface') 其中InterfaceClass是一个普通的类.
    • @Zidadi 你说的很对,我的答案是错误的,我会看看给你一个正确的答案。
    • @Zidadi 更新以解释 InterfaceClass 如何成为元类。
    猜你喜欢
    • 2012-01-28
    • 2011-02-01
    • 2011-03-03
    • 1970-01-01
    • 2021-02-26
    • 2018-10-19
    • 1970-01-01
    • 2016-10-04
    • 2011-05-10
    相关资源
    最近更新 更多