Доступ к общедоступным атрибутам класса Python в Java с помощью Jython

для доступа к объектам Python в Java с использованием Jython, необходимо создать интерфейс Java и использовать coersion ( PyObject.__java__() ), чтобы назначить объект ссылке Java. ( http://www.jython.org/faq2.html )

Проблема в том, что в библиотеке Python, которую я пытаюсь использовать, нет наборов и наборов, и я не хочу менять код библиотеки, если могу.

Есть ли способ получить эти общедоступные переменные без необходимости реализовывать классы 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) работает только для интернированных строк.

Кроме того, вы можете вызвать метод python, используя __call__(PyObject[] args, String[] keywords) :

 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 .