"implements" 在 Python class 定义中是什么意思?

What does "implements" mean in Python class definition?

下面的代码示例来自 BeeWare 套件示例。 (https://github.com/eliasdorneles/drawingapp-voc/blob/master/drawingapp/app.py)

表达式implements=android.view.View[OnClickListener]是什么意思?应该有(列表)base class(es)。是不是框架或标准的一些不兼容的特殊语法 python 我无法理解(并且文档中缺少)?

此外,我们在这里使用从未导入的 OnClickListener。在 android.Constants.OnClickListener 之类的符号之前没有通配符导入 (*) 和模块前缀。在这种情况下,Python 解释器如何找到 OnClickListener 值?

import android
from android.widget import LinearLayout, TextView, Button
import android.content.Context
from android.graphics import Bitmap, Canvas, Color, Paint, Path, PorterDuff
from android.view import MotionEvent, Gravity
import android.view

class ButtonClick(implements=android.view.View[OnClickListener]):
    def __init__(self, callback, *args, **kwargs):
        self.callback = callback

'''

所以,这里的谜团的关键在于,这不完全是 Python 代码 - 相反,它是一个源文件,打算用 VOC 转译 - 将生成 Java 字节码,它将被进一步处理以作为使用标准 Android Api 的 Android 应用程序工作。

作为一个转译器,VOC 依赖于有效的语法 Python,但它允许自己从官方语言中走弯路——比如在 class 定义中使用关键字参数。只有在 Python 继承一个 class 实现特殊方法 __init_subclass__ 或使用自定义元 class 来解释这些参数时,这才有意义 - 否则它们没有效果。此外,VOC 可能使用这些关键字(extendsimplements)来准确指示这些词,因为它们在 Java class 声明语法中。

此外,正如您所说,OnClickListener 中的名称在正常情况下会因 NameError 而失败 Python - VOC 可能定义了其他名称表现得像内置名称。在普通 Python 中,如果您创建 function/method 定义而不是 class 定义,则可以使用非导入或未定义的名称作为注释。也就是说,在函数定义中,android.view.View[OnClickListener] 将跟随 : 而不是 =。在 Python 3.7 中(但在 Python 3.6 中没有),注解是延迟求值的,所以它不会导致错误。但是,实际上,它只会在正常 Python.

中引发 NameError

这是 Python android 在 PyBee 中使用 VOC 的应用程序的快速入门 https://pybee.org/project/using/android-app/

更新 在我发现 VOC 后对答案进行了广泛改写,尽管 "this is not Python" 上的第一个发现是正确的)

Python 的 class definition syntax lets you use keyword=value entries just as much as base classes. By default metaclass=... has meaning, and when using __init_subclass__,其他此类关键字参数将传递给该方法。因此,从语法的角度来看,在 class 定义中使用 implements= 是可以的。

请注意,BeeWare 不 运行 Python Android,它使用 transpiler called VoC to translate Python code to Java. The implements= keyword argument in classes is used to let you define Java interfaces in Python code。大概像 OnClickListener 这样的附加名称是可用的,因为 VoC 使它们可用。

VoC 将 Python 字节码翻译成 Java,因此 BeeWare 兼容 Python 必须实现的是正确的 Python 语法NameErrors 等运行时问题不一定是问题,Java 翻译器可以弥补这一点。