编程语言
首页 > 编程语言> > java-Jython-从Python类创建类实例和执行方法的正确方法

java-Jython-从Python类创建类实例和执行方法的正确方法

作者:互联网

我有一个包含类的Python文件.我需要创建该类的实例,并能够通过Java调用其中的方法.

我想出了这样的解决方案:

    PythonInterpreter r = new PythonInterpreter();
    r.execfile("File.py");


    PyObject p = r.eval("Car().begin()");
    System.out.println(p.toString());

和python代码:

class Car(SomeExtendedClass):

    myvar = 5

    def set(self, my):
        self.myvar = my;

    def begin(self):
        return self.myvar

现在,当我执行此命令时,它会显示5但如果我运行以下代码:

    PyObject p = r.eval("Car().begin()");
    System.out.println(p.toString());

    r.eval("Car().set(7)");

    p = r.eval("Car().begin()");

    System.out.println(p.toString());

它仍然会打印5,而不是7

好像我没有创建Car的一个实例,而是总是创建一个新实例,而不是使用创建的实例.

我对吗?

是否可以从Python文件中的类创建新实例,并使用Java方法调用/获取数据?

我尝试使用eval()加载PyInstance,但无法从中强制转换异常:

return (PyInstance) this.interpreter.eval(className);

解决方法:

每当调用Car()时,都将创建该类的新实例.因此,这将创建一个新对象并调用其set方法:

r.eval("Car().set(7)");

但这然后创建了另一个实例,而不是操纵现有实例:

p = r.eval("Car().begin()");

调用r.eval(“ Car().begin()”);会根据需要创建一个新的python对象,但实际上会返回对该python对象的引用,该引用包含begin()方法的返回值-而不是创建的实例.这不是你想要的.

完全按照定义保留python类,此代码获得对该类单个实例的引用:

PyObject p = r.eval("Car()");

(正如您已经看到的,另一种方法是省略括号,该括号使您获得对python类对象的引用,然后在其上使用__call__创建实例).

然后在现有实例上调用该方法:

p.invoke("set", Py.newInteger(7));

为了获得修改后的值,因为它是实例的属性,并且无法通过“ getter”方法使用,所以PyObject类的getattr方法可以获取它(或者您可以在python代码中添加get方法) :

System.out.println(p.__getattr__("myvar"));

遗憾的是,一旦您通过p获得了对该对象的引用,就不能仅使用Java语法调用该对象上的方法,但是Java当然不知道Python对象上可用的方法和/或属性,即使它知道由于Python的动态特性,它们是否可以随时更改?因此,您剩下诸如invoke的方法来将Java / Python绑定在一起.

标签:jython,python,java
来源: https://codeday.me/bug/20191029/1957815.html