Что значит «реализует» в определении класса Python? - PullRequest
0 голосов
/ 08 января 2019

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

0 голосов
/ 08 января 2019

Синтаксис определения класса в 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 s, не должны быть проблемой, это то, что может компенсировать переводчик Java.

0 голосов
/ 08 января 2019

Итак, ключ к загадке здесь в том, что это не совсем код 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/

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

...