2012-10-15 39 views
5

मैं एक .py के बारे में एक प्रोग्राम लिखने की कोशिश कर रहा हूं, एक जावा इंटरफ़ेस का विस्तार करें, जैसे example on IBM developerworksज्योथन विशेषता त्रुटि: केवल पढ़ने के लिए attr

लेकिन मैं की तरह एक समस्या है:

AttributeError: read-only attr: cardID 

लेकिन अजीब बात यह है कि अगर मैं cardNum को cardID नाम बदलने है, यह काम करता है। यहाँ मेरा कोड:

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 

और जावा इंटरफ़ेस:

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

और जावा फ़ाइल

 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

ऐसा लगता है कि कार्डआईडी एक कीवर्ड्स या कुछ है, मैंने कार्डनिड, सीआईडी ​​इत्यादि की कोशिश की है, यह – user1746290

उत्तर

3

यह सिर्फ एक अनुमान है (अभी यह परीक्षण नहीं कर सकता क्योंकि मैं अपने पीसी पर नहीं हूं), लेकिन आपकी समस्या शायद (कुछ हद तक दस्तावेज) तथ्य से संबंधित है कि jython generates property accessors for javas getter/setter methods, जो आपके गुणों के नाम से टकराती है और इस प्रकार आपकी वास्तविक विशेषता छाया।

यदि मेरी परिकल्पना सही है, तो इस मामले में समस्या यह है कि आपके पास एक गेटटर विधि है जिसका नाम समान है (get भाग) विशेषता के रूप में। ज्योथन विधि को देखता है और इसके लिए एक संपत्ति उत्पन्न करता है, जो read-only है क्योंकि कोई मिलान करने वाला सेटर विधि नहीं है।

यह हो सकता है कि आप विधि को setCardID पर विधि का नाम बदलकर ठीक कर सकें ताकि ज्योथन सही रूप से विशेषता को लिखने योग्य तरीके से व्याख्या कर सके। यदि यह किसी कारण के लिए काम नहीं करता है, निम्न में से एक निश्चित रूप से कार्य करना चाहिए:

  • कुछ और करने के लिए विशेषता का नाम बदलने के लिए वैकल्पिक रूप self.myCardID
  • की तरह, कुछ और करने के लिए विधि का नाम बदलने, getID
की तरह

इन दोनों समाधानों से संपत्ति एक्सेसर द्वारा अब विशेषता को छायांकित नहीं किया जाना चाहिए।

+0

काम करता है इसे विशेषता का नाम बदलकर हल किया जा सकता है लेकिन विधि नहीं, मैंने ज्योथन स्रोत कोड से डीबग किया है, यह खुश है init function "self.cardID", तो आप सही हैं, लेकिन अन्यथा, मुझे कोड में "कार्डआईडी" के बारे में कुछ भी नहीं मिल रहा है। वैसे भी, यह मेरे लिए सिर्फ अजीब है, इसे बहुत आसान हल किया जा सकता है.अब मेरे पास है अरेडी ने ज्योथन कारखाना बनाया, लेकिन यह स्क्रिप्ट चलाने पर धीमा है। – user1746290