gpt4 book ai didi

java - 使用 Jython 访问 Java 中 Python 类的公共(public)属性

转载 作者:行者123 更新时间:2023-11-30 09:10:52 28 4
gpt4 key购买 nike

要使用 Jython 访问 Java 中的 Python 对象,必须创建一个 Java 接口(interface)并使用强制转换 (PyObject.__java__()) 将对象分配给 Java 引用。 ( http://www.jython.org/faq2.html )

问题是我尝试使用的 Python 库没有获取和设置,如果可以的话我不想更改库代码。

有没有一种方法可以获取这些公共(public)变量,而不必实现 Python 类来子类化并通过方法公开这些属性?

谢谢。

最佳答案

您可以从 PyObject 访问属性直接使用 __getattr__(PyString)__setattr__(PyString, PyObject)方法。

您可以获得一个属性:

PyObject pyObject = ...;
// Get attribute: value = getattr(obj, name)
// OR: value = obj.__getattr__(name)
PyString attrName = Py.newString("some_attribute");
PyObject attrValue = pyObject.__getattr__(attrName);
  • 警告:确保使用 __getattr__(PyString) 因为 __getattr__(String)仅适用于内部字符串。

您还可以设置属性:

PyObject pyObject = ...;
// Set attribute: setattr(obj, name, value)
// OR: obj.__setattr__(name, value)
PyString attrName = Py.newString("some_attribute");
PyObject attrValue = (PyObject)Py.newString("A string as the new value.");
pyObject.__setattr__(attrName, attrValue);
  • 注意:值不必是 PyString。它必须是 PyObject

  • 警告:确保使用 __setattr__(PyString, PyObject) 因为 __setattr__(String, PyObject)仅适用于内部字符串。

此外,您可以使用 __call__(PyObject[] args, String[] keywords) 调用 python 方法:

PyObject pyObject = ...;

// Get method: method = getattr(obj, name)
// OR: method = obj.__getattr__(name)
PyString methodName = Py.newString("some_method");
PyObject pyMethod = pyObject.__getattr__(methodName);

// Prepare arguments.
// NOTE: args contains positional arguments followed by keyword argument values.
PyObject[] args = new PyObject[] {arg1, arg2, ..., kwarg1, kwarg2, ...};
String[] keywords = new String[] {kwname1, kwname2, ...};

// Call method: result = method(arg1, arg2, ..., kwname1=kwarg1, kwname2=kwarg2, ...)
PyObject pyResult = pyMethod.__call__(args, keywords);
  • 注意:当按名称获取属性需要 PyString 时,我无法解释为什么关键字名称是 String

关于java - 使用 Jython 访问 Java 中 Python 类的公共(public)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22334747/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com