Jython AttributeError: 只读属性

5
我正在尝试编写一个关于将.py扩展到Java接口的程序,就像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();
        }

有人知道如何解决这个问题吗?


似乎cardID是一个关键字或者其他什么东西,我已经尝试了CardNID,CID等,它们都可以工作。 - user1746290
1个回答

4
这只是一个猜测(因为我现在不在自己的电脑上,无法测试),但您的问题可能与(文档不太充分的)事实有关,即jython 为 Java 的 getter/setter 方法生成属性访问器,这些方法与属性名称冲突,从而遮盖了您的实际属性。
如果我的假设正确,在这种情况下问题就在于您有一个getter方法,其名称(减去get部分)与属性相同。Jython看到该方法并为其生成一个属性,因为没有匹配的setter方法,所以该属性是只读的。
也许您可以通过将setID方法重命名为setCardID来修复此问题,以便jython正确解释属性为可写入。如果由于某种原因这样做不起作用,则以下两种解决方案之一肯定会起作用:
  • 将属性重命名为其他名称,例如self.myCardID
  • 或者,将方法重命名为其他名称,例如getID
这两种解决方案都应该使属性不再被属性访问器遮盖。

这个问题可以通过重命名属性而不是方法来解决。我使用 Jython 源代码进行了调试,发现问题出现在 init 函数的 "self.cardID" 中,所以你是正确的。但是,在代码中我找不到任何与 "cardID" 相关的信息。无论如何,对我来说这很奇怪,但很容易解决。现在我已经建立了 Jython 工厂,但运行脚本速度较慢。 - user1746290

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接