5

IBM developerworksの例のように、Java インターフェイスを拡張する .py に関するプログラムを作成しようとしています。

しかし、次のような問題がありました。

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

誰もこれを解決する方法を知っていますか?

4

1 に答える 1

4

これは単なる推測です(私は自分のPCを使用していないため、現在テストできません)が、あなたの問題はおそらく、jythonが javas getter/setter methods のプロパティアクセサーを生成するという(やや文書化されていない)事実に関連しています。属性名と衝突し、実際の属性を隠します。

私の仮説が正しければ、この場合の問題は、属性と同じ名前 (部分を除く) を持つ getter メソッドがあることgetです。Jython はメソッドを認識し、そのプロパティを生成します。これはread-only、一致するセッター メソッドがないためです。

setIDメソッドの名前を変更してsetCardID、jython が属性を書き込み可能として正しく解釈するようにするだけで、これを修正できる場合があります。これが何らかの理由で機能しない場合は、次のいずれかが確実に機能するはずです。

  • 属性の名前を別の名前に変更します。self.myCardID
  • または、メソッドの名前を別の名前に変更します。getID

これらのソリューションはどちらも、属性がプロパティ アクセサーによってシャドウされないようにする必要があります。

于 2012-10-15T12:16:04.650 に答える