Что значит "реализует" в определении класса 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 может компенсировать.