2012-10-15 24 views
5

Bir .py hakkında bir program yazmayı, bir example on IBM developerworks gibi bir java arabirimini genişletmeye çalışıyorum.Jython AttributeError: salt okunur attr

Ama böyle bir sorun var:

AttributeError: read-only attr: cardID 

Ama cardNum için cardID adlandırmak eğer tuhaf bir şeydir, çalışıyor. İşte benim kod:

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 

ve java arayüzü:

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

ve

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

Bunu çözebilecek bilen java dosya?

+0

cardID bir KeyWord veya bir şey, CardNID , CID , vs çalıştığı görünüyor , çalışır – user1746290

cevap

3

Bu sadece bir tahmindir (kendi bilgisayarımda olmadığım için şu anda test edemiyorum), ancak sorununuz muhtemelen öznitelik adınızla çakışan jython generates property accessors for javas getter/setter methods (biraz düşük belgeli) ile ilgilidir. ve böylece gerçek özniteliğinizi gölgeleyin.

Hipotezim doğruysa, bu durumda sorun, öznitelikle aynı ada sahip (get bölümü) bir getter yöntemine sahip olmanızdır. Jython, yöntemi görür ve bunun için bir özellik oluşturur; bu, read-only'dur, çünkü eşleşen ayar yöntemi yoktur.

setID yönteminizi setCardID olarak yeniden adlandırarak bu sorunu giderebilirsiniz, bu nedenle jython özelliği niteliği yazılabilir olarak doğru şekilde yorumlar. Bu nedense çalışmazsa, aşağıdakilerden biri kesinlikle çalışması gerekir:

  • alternatif self.myCardID
  • gibi başka bir şeye niteliği adlandırmak başka bir şey yöntemini adlandırmak, getID
gibi

Her iki çözüm de özniteliğin artık özellik erişimcisi tarafından gölgelenmesine neden olmamalıdır.

+0

Öznitelik yeniden adlandırılabilir, ancak yöntemi yeniden değil, jython kaynak kodu ile hata ayıklama, çözme init işlevi "self.cardID" , yani haklısın, ama aksi halde, ben kodda "cardID" hakkında bir şey bulamıyorum.Away, benim için sadece garip, çok kolay çözülebilir.Şimdi Ardından, jython fabrikasını oluşturdu ancak senaryoyu çalıştırmakta yavaştır. – user1746290

İlgili konular