Лучший способ обернуть Java-классы в Python - PullRequest
0 голосов
/ 09 мая 2018

У меня есть библиотека Java, и я должен построить для нее оболочку Python.

Я использую py4j , и довольно легко получить любой экземпляр и любой класс в комплекте с методом.

Проблема в том, что тип объекта не соответствует его классу.

Из питона:

>>> gw = JavaGateway()
>>> a_circle = gw.jvm.com.geometry.Circle(15)
>>> a_circle.getDiameter()
30
>>> type(a_circle)
<class 'py4j.java_gateway.JavaObject'>

Это почти нормально для базового использования, но что, если я хочу создавать собственные конструкторы? Должен ли я создать подкласс класса JavaObject? Или лучше создавать свои классы с нуля, и для каждого метода и конструктора вызывать соответствующий метод Java?

Любое предложение о хорошем способе достижения этого? Должен ли я попробовать что-то другое, чем py4j? Спасибо!

РЕДАКТИРОВАТЬ: например, я должен обернуть Java-класс, который имеет 3 метода, один из этих методов принимает массив в качестве параметра, поэтому мне нужно ввести некоторый код для преобразования.

class Service:
    def __init__(self, javaService):
    '''
    Create a new instance of Service, assigning Java methods as attributes.
    Accepts a working instance of Service from Java
    This constructor is not meant to be called by the user.
    '''

    self.subscribe = javaService.subscribe
    self.unsubscribe = javaService.unsubscribe

    def publish(values):
        '''
        Wraps the java implementation of this method, converting the list of value from a Python iterable to a Java list.
        '''
        global java_gateway
        parameterValues = ListConverter().convert(values, java_gateway._gateway_client)
        return javaService.publish(values)
    self.publish = publish

Это работает, но я делаю только тогда, когда это необходимо. Если класс просто работает напрямую, я не пишу ничего, чтобы обернуть его.

...