【发布时间】:2011-10-12 03:14:38
【问题描述】:
我试图了解 Zope 界面的工作原理。我知道接口只是接口类的一个实例,它只是一个普通的类。但是如果接口只是一个类实例,为什么它可以作为一个基类来继承呢?
例如 IFoo 类(接口): 通过
你能给我一些见解吗?谢谢你。
【问题讨论】:
我试图了解 Zope 界面的工作原理。我知道接口只是接口类的一个实例,它只是一个普通的类。但是如果接口只是一个类实例,为什么它可以作为一个基类来继承呢?
例如 IFoo 类(接口): 通过
你能给我一些见解吗?谢谢你。
【问题讨论】:
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 完成了剩下的工作。
【讨论】: