使用Jython在Java中访问Python类的公共属性

2 投票
1 回答
659 浏览
提问于 2025-04-17 21:50

要在Java中使用Jython访问Python对象,首先需要创建一个Java接口,然后使用一种叫做类型转换的方式(PyObject.__java__())把Python对象赋值给Java的引用。(http://www.jython.org/faq2.html)

问题是我想用的Python库没有提供获取和设置的方法,而且如果可以的话,我不想修改这个库的代码。

有没有办法在不需要实现Python类来继承并通过方法暴露这些属性的情况下,获取这些公共变量呢?

谢谢。

1 个回答

2

你可以直接通过使用 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);
  • 注意:我无法解释为什么这里的关键字名称是 String,而通过名称获取属性时需要 PyString

撰写回答