Zope接口是如何实现的?

发布于 2024-11-26 04:22:52 字数 181 浏览 1 评论 0原文

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

例如 IFoo类(接口): pass

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

I tried to understand how Zope interface work. I know Interface is just an instance of InterfaceClass which is just an ordinary Class. But if Interface is just a class instance, why it can be used as a base class to be inherited from?

e.g.
Class IFoo(Interface):
pass

Could you give me some insights? Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

乜一 2024-12-03 04:22:52

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

Interface 类(或其基础规范和元素)设置了多个。查找以双下划线 (__) 开头的任何变量集以获取理解:

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

  • __name__:定义类的名称。

  • __bases__:该类的基类。

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

另外,作为基类使用时,会调用InterfaceClass__init__方法; Python 基本上将基类视为元类,每当我们在类定义中使用它时,都会创建基类的类(元类)的新实例。这意味着 __init__ 方法将传递新的 __name____bases__ 值,以及所有新的类属性作为关键字参数(包括__module__ 和可选的 __doc__)。

这全部记录在 Python 数据模型的 标准类型层次结构部分中文档(查找有关特殊属性的“类”段落),以及 同一个文档,在自定义类创建部分(具有 __class__ 属性的基类被视为类型)。

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

Python is inherently flexible, and any object can be a base class as long as it looks like a base class. As is always the case with Python, that means implementing some attributes that are expected to be found on a Python classes.

The Interface class (or it's bases Specification and Element) sets several. Look for any variables set starting with a double underscore (__) to gain an understanding:

  • __module__: A string containing the python path module.

  • __name__: The name under which the class was defined.

  • __bases__: The base classes of this class.

  • __doc__: (optional) The docstring of the class.

In addition, the InterfaceClass __init__ method will be called when used as a base class; Python basically treats base classes as metaclasses, and a new instance of the base class's class (metaclass) will be created whenever we use it in a class definition. This means that the __init__ method will be passed the new __name__ and __bases__ values, as well as all the new class attributes as keyword arguments (including __module__ and an optional __doc__).

This is all documented in the Standard type hierarchy section of the Python Data Model document (look for the 'classes' paragraph on special attributes), and in the same document, in the Customizing class creation section (base classes with a __class__ attribute are deemed a type).

So, any python instance that defines at least __module__, __name__ and __bases__ attributes, and a suitable __init__ method will work as a base class for other classes. Python does the rest.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文