0

我有一个 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

这行得通,但我只在必要时才这样做。如果类只是直接工作,我不会写任何东西来包装它。

4

0 回答 0