Jython AttributeError:只读attr

时间:2012-10-15 07:27:40

标签: java jython readonly

我正在尝试编写一个关于.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();
        }
谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

这只是一个猜测(现在无法测试它,因为我不在我自己的电脑上),但你的问题可能与jython generates property accessors for javas getter/setter methods发生碰撞的(有点未被记录的)事实有关。您的属性名称,从而遮蔽您的实际属性。

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

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

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

这两个解决方案都应该使属性不再被属性访问器遮蔽。