5

我正在尝试编写一个关于 .py 扩展 java 接口的程序,就像IBM developerworks 上的示例一样。

但我遇到了这样的问题:

AttributeError: read-only attr: cardID

但奇怪的是,如果我将 cardID 重命名为 cardNum,它就可以了。这是我的代码:

卡片信息.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();
        }

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

4

1 回答 1

4

这只是一个猜测(现在无法测试它,因为我不在我自己的电脑上),但您的问题可能与jython 为 javas getter/setter 方法生成属性访问器的(有些未充分记录的)事实有关,这与您的属性名称冲突,从而影响您的实际属性。

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

可能您可以通过将setID方法重命名为setCardID以便 jython 正确地将属性解释为可写来解决此问题。如果由于某种原因这不起作用,则以下其中一项绝对应该起作用:

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

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

于 2012-10-15T12:16:04.650 回答