3

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

表达是什么implements=android.view.View[OnClickListener]意思?应该有(一个列表)基类。是我无法理解的框架或标准 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

'''

4

2 回答 2

3

所以,这里的谜团的关键在于,这不是完全 Python 代码——而是一个源文件,旨在使用VOC进行转译——将生成 Java 字节码,该字节码将被进一步处理以作为 Android 应用程序使用标准的安卓 API。

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

此外,正如您所说,其中的名称在普通 PythonOnClickListener中会失败NameError- VOC 很可能定义了其他名称,这些名称的行为类似于内置名称。在普通 Python 中,如果您创建函数/方法定义而不是类定义,则可以使用未导入或未定义的名称作为注释。这 android.view.View[OnClickListener]将在函数定义中:而不是, 之后出现。=注释在 Python 3.7 中被延迟评估(但在 Python 3.6 中没有),所以它不会导致错误。但事实上,它只会在普通 Python 中引发 NameError 。

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

在我发现 VOC 后,更新答案被广泛改写,尽管“这不是 Python”的第一个发现是正确的)

于 2019-01-07T22:12:44.413 回答
2

Python 的类定义语法让您可以像使用keyword=value基类一样使用条目。默认情况下metaclass=...是有意义的,当使用 时__init_subclass__,其他这样的关键字参数被传递给该方法。因此implements=,从语法的角度来看,在类定义中使用是可以的。

请注意,BeeWare不在Android 上运行 Python,它使用名为 VoC的转译器将 Python 代码转换为 Java。类中的implements=关键字参数用于让您在 Python 代码中定义 Java 接口。据推测,OnClickListener由于 VoC 使它们可用,因此可以使用其他名称。

VoC 将 Python 字节码转换为 Java,因此与 BeeWare 兼容的 Python 所要做的就是正确的 Python 语法。诸如NameErrors 之类的运行时问题不一定是问题,这是 Java 翻译器可以弥补的。

于 2019-01-07T22:17:20.117 回答