Jython属性错误:只读属性



我正试图编写一个关于.py扩展java接口的程序,就像IBMdeveloperworks上的一个例子一样。

但我遇到了一个问题:

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();
}

有人知道怎么解决这个问题吗?

这只是一个猜测(因为我不在自己的电脑上,所以现在无法测试它),但您的问题可能与以下事实有关(有些文档不足):jython为javas getter/setter方法生成属性访问器,这些访问器与您的属性名称冲突,从而遮蔽了您的实际属性。

如果我的假设是正确的,那么这种情况下的问题是,您有一个getter方法,它的名称(减去get部分)与属性相同。Jython看到该方法并为其生成一个属性,即read-only,因为没有匹配的setter方法。

您可以通过将setID方法重命名为setCardID来解决此问题,这样jython就可以正确地将属性解释为可写。如果由于某种原因这不起作用,那么以下其中一个肯定会起作用:

  • 将属性重命名为其他属性,如self.myCardID
  • 或者,将该方法重命名为其他方法,如getID

这两种解决方案都应使属性访问器不再对属性进行阴影处理。

相关内容

最新更新