我有一个 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 不同的东西吗?谢谢!
编辑:例如,我必须包装一个具有 3 个方法的 Java 类,其中一个方法需要一个数组作为参数,所以我必须注入一些代码才能进行转换。
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
这行得通,但我只在必要时才这样做。如果类只是直接工作,我不会写任何东西来包装它。