我正在尝试编写一个关于.py扩展java接口的程序,就像example on IBM developerworks一样。
但是我遇到了一个问题:
AttributeError: read-only attr: cardID
但奇怪的是,如果我将cardID重命名为cardNum,它就可以了。这是我的代码:
CardInfo.py
from com.jyt import CardInfo
class CardInfo(CardInfo):
def __init__(self):
self.cardName = "Dark Magician"
self.cardID = "888"
def getName(self):
return self.cardName
def getCardID(self):
return self.cardID
def setID(self,newID):
self.cardID = newID
和java接口:
public interface CardInfo {
public String getCardID();
public String getName();
public void setID();
}
和java文件
Object javaObject;
PythonInterpreter interpreter = new PythonInterpreter();
// PySystemState sys = Py.getSystemState();
interpreter.execfile("./res/CardInfo.py");
interpreter.exec("cardInfo=CardInfo()");
PyObject pyObject = interpreter.get("cardInfo");
pyObject.invoke("setID",new PyString("12345"));
try{
javaObject = pyObject.__tojava__(CardInfo.class);
CardInfo cardInfo = (CardInfo)javaObject;
System.out.println(cardInfo.getCardID());
System.out.println(cardInfo.getName());
}catch(Exception e){
e.printStackTrace();
}
谁知道如何解决这个问题?
答案 0 :(得分:3)
这只是一个猜测(现在无法测试它,因为我不在我自己的电脑上),但你的问题可能与jython generates property accessors for javas getter/setter methods发生碰撞的(有点未被记录的)事实有关。您的属性名称,从而遮蔽您的实际属性。
如果我的假设是正确的,那么在这种情况下的问题是你有一个与属性具有相同名称(减去get
部分)的getter方法。 Jython看到了该方法并为其生成了一个属性read-only
,因为没有匹配的setter方法。
您可以通过将setID
方法重命名为setCardID
来解决此问题,以便jython正确地将该属性解释为可写。如果由于某种原因这不起作用,下列之一肯定会起作用:
self.myCardID
getID
这两个解决方案都应该使属性不再被属性访问器遮蔽。