2012-10-15 19 views
5

Sto provando a scrivere un programma su un .py estendere un'interfaccia java, proprio come un example on IBM developerworks.Jython AttributeError: read-only attr

Ma ho avuto un problema simile:

AttributeError: read-only attr: cardID 

Ma la cosa strana è che se cambio titolo il cardID per CARDNUM, funziona. Ecco il mio codice:

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 

e l'interfaccia Java:

public interface CardInfo { 
    public String getCardID(); 
    public String getName(); 
    public void setID(); 
} 

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

qualcuno sa come risolvere questo?

+0

sembra che cardID sia un KeyWord o qualcosa, ho provato CardNID, CID, ecc. Funziona – user1746290

risposta

3

Questa è solo una supposizione (non riesco a testarlo in questo momento perché non sono sul mio pc), ma il tuo problema è probabilmente correlato al fatto (un po 'sottodimensionato) che jython generates property accessors for javas getter/setter methods, che si scontrano con i nomi degli attributi e quindi ombreggia il tuo attributo attuale.

Se la mia ipotesi è corretta, il problema in questo caso è che si dispone di un metodo getter che ha lo stesso nome (meno la parte get) come attributo. Jython vede il metodo e genera una proprietà per esso, che è read-only perché non esiste un metodo di setter corrispondente.

È possibile risolvere questo problema semplicemente rinominando il metodo setID in setCardID in modo che jython interpreti correttamente l'attributo come scrivibile. Se questo non funziona per qualche motivo, una delle seguenti deve assolutamente funzionare:

  • rinominare l'attributo a qualcos'altro, come self.myCardID
  • in alternativa, rinominare il metodo per qualcos'altro, come getID

Entrambe queste soluzioni dovrebbero far sì che l'attributo non venga più oscurato dall'accessorio della proprietà.

+0

Può essere risolto rinominando l'attributo ma non il metodo, ho eseguito il debug con il codice sorgente jython, è successo in init "auto.cardID", quindi hai ragione, ma in caso contrario, non riesco a trovare nulla su "cardID" nel codice. Comunque, è solo strano per me, può essere risolto molto facilmente.Ora ho aready ha creato la fabbrica di jython, ma è lento nell'eseguire la sceneggiatura. – user1746290