У меня есть библиотека 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
Это работает, но я делаю только тогда, когда это необходимо. Если класс просто работает напрямую, я не пишу ничего, чтобы обернуть его.