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