【问题标题】:What does "implements" mean in Python class definition?Python 类定义中的“实现”是什么意思?
【发布时间】:2019-06-02 14:19:33
【问题描述】:

下面的代码示例来自 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

'''

【问题讨论】:

  • 在自述文件中说这个 python 代码被编译成 Java。所以我相信代码永远不应该在标准解释器上运行,实际上会引发异常。
  • Python 的class definition syntax 让您可以像使用基类一样使用keyword=value 条目。默认情况下metaclass=... 是有意义的,当使用__init_subclass__ 时,其他此类关键字参数将传递给该方法。据推测,BeeWare 套件依赖于该语法。

标签: python import python-import beeware voc


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    请注意,BeeWare 不会在 Android 上运行 Python,它使用 transpiler called VoC 将 Python 代码转换为 Java。类中的implements= 关键字参数用于let you define Java interfaces in Python code。大概像 OnClickListener 这样的附加名称是可用的,因为 VoC 使它们可用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-01
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多