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

时间:2014-03-11 19:29:18

标签: java python jython

使用Jython访问Java中的Python对象,创建Java接口并使用coersion(PyObject.__java__())将对象分配给Java引用是必要的。 (http://www.jython.org/faq2.html

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

有没有办法让那些公共变量没有必须实现Python类来子类化并通过方法公开这些属性?

感谢。

1 个答案:

答案 0 :(得分: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