Что значит "реализует" в определении класса Python?

Ниже приведен пример кода из примера 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

"""

2 ответа

Решение

Итак, ключ к загадке здесь заключается в том, что это не совсем код Python, а скорее исходный файл, предназначенный для переноса с помощью VOC, который сгенерирует байт-код Java, который затем будет обработан для работы в качестве приложения Android с использованием стандартный Android Api.

Как транспортер, VOC опирается на синтаксис, который является допустимым Python, но он позволяет себе брать обходные пути от официального языка - как использование аргументов ключевых слов в определениях классов. Это имеет смысл только в Python, если он наследует класс, который будет реализовывать специальный метод __init_subclass__или используйте пользовательский метакласс для интерпретации этих аргументов - иначе они не будут иметь никакого эффекта. Кроме того, VOC, вероятно, использовать эти ключевые слова (extends а также implements) точно указывать эти слова в том виде, в каком они есть в синтаксисе объявления класса Java

Кроме того, как вы выразились, название OnClickListener как это там не получится с NameError в обычном Python - вероятно, что VOC определяет дополнительные имена, которые ведут себя как встроенные имена. В обычном Python, если вы создаете определение функции / метода вместо определения класса, можно использовать не импортированные или неопределенные имена в качестве аннотаций. То есть android.view.View[OnClickListener] будет следовать : вместо =в определении функции. Аннотации лениво оцениваются в Python 3.7 (но не в Python 3.6), поэтому это не приведет к ошибке. Как бы то ни было, он просто вызовет NameError в обычном Python.

Вот быстрый старт для приложений Python для Android, использующих VOC в PyBee https://pybee.org/project/using/android-app/

обновленный ответ был значительно перефразирован после того, как я узнал о ЛОС, хотя первые выводы о том, что "это не Python" были правильными)

Синтаксис определения класса Python позволяет использовать keyword=value Записи так же, как базовые классы. По умолчанию metaclass=... имеет значение, и при использовании __init_subclass__ другие аргументы такого ключевого слова передаются этому методу. Итак, используя implements= в определении класса хорошо с точки зрения синтаксиса.

Обратите внимание, что BeeWare не запускает Python на Android, он использует транспортер под названием VoC для перевода кода Python на Java. implements= Аргумент ключевого слова в классах используется для определения интерфейсов Java в коде Python. Предположительно дополнительные имена, такие как OnClickListener доступны, потому что VoC делает их доступными.

VoC переводит байт-код Python в Java, поэтому все, чего должен достичь Python, совместимый с BeeWare, - это правильный синтаксис Python. Проблемы во время выполнения, такие как NameError Это не должно быть проблемой, это то, что переводчик Java может компенсировать.

Другие вопросы по тегам