2012-10-15 15 views
5

我想寫一個關於.py的程序擴展java接口,就像example on IBM developerworks一樣。Jython AttributeError:只讀attr

但是我有一個問題,如:

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

有誰知道如何解決這個問題?

+0

似乎cardID是一個關鍵字或東西,我試過CardNID,CID等,它的工作 – user1746290

回答

3

這只是一個猜測(現在無法測試,因爲我不在自己的電腦上),但是您的問題可能與(與您的屬性名稱衝突的(事實上有些未被證實的)事實相關從而影響你的實際屬性。

如果我的假設是正確的,在這種情況下,問題是您有一個getter方法,它具有與屬性相同的名稱(減去get部分)。 Jython會看到該方法併爲其生成一個屬性,因爲沒有匹配的setter方法,所以它是read-only

這可能是因爲您可以通過將setID方法重命名爲setCardID來修復此問題,以便jython正確地將該屬性解釋爲可寫。如果這不會出於某種原因,下面的一個絕對應該工作:

  • 重命名的屬性別的東西,像self.myCardID
  • 或者,重命名方法到別的東西,像getID

這兩種解決方案都應該使該屬性不再被屬性訪問器隱藏。

+0

它可以通過重命名屬性而不是方法來解決,我用jython源代碼進行調試,它發生在init函數「self.cardID」,所以你是對的,但除此之外,我在代碼中找不到任何有關「cardID」的內容。總之,這對我來說很奇怪,它可以很容易地解決。現在,我已經由jython工廠構成,但運行腳本運行緩慢。 – user1746290