2011-09-10 17 views
5

प्राप्त हुआ है, इसलिए मेरे पास तालिका ऑब्जेक्ट के लिए यह कोड नीचे है, और इसमें फ़ील्ड नामों के लिए एक संपत्ति है।डिस्क्रिप्टर 'गेटटर' को 'संपत्ति' ऑब्जेक्ट की आवश्यकता होती है लेकिन उसे 'फ़ंक्शन'

seas486:PennAppSuite ceasarbautista$ python 
Python 2.7.1 (r271:86832, Jun 25 2011, 05:09:01) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import table 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "table.py", line 7, in <module> 
    class Table(object): 
    File "table.py", line 9, in Table 
    @property.getter 
TypeError: descriptor 'getter' requires a 'property' object but received a 'function' 

किसी को भी व्याख्या कर सकते हैं कि इस त्रुटि का अर्थ है:

class Table(object): 
    '''A CSV backed SQL table.''' 
    @property 
    def fieldnames(self): 
     with open(self.filename) as f: 
      return csv.DictReader(f).fieldnames 

    @property.setter 
    def fieldnames(self, fieldnames): 
     with open(self.filename, 'w') as f: 
      dr = csv.reader(f) 
      dw = csv.DictWriter(f, fieldnames=fieldnames) 
      dw.writerow(dict((field, field) for field in fieldnames)) 
      for row in self: 
       dw.writerow(row) 

जब मैं फ़ाइल आयात करने की कोशिश, मैं त्रुटि मिलती है?

उत्तर

16

मुझे लगता है कि यह TypeError: unbound method ... must be called with ... instance as first argument (got ... instance instead) के बराबर है। एक सजावट के माध्यम से किसी संपत्ति के लिए एक सेटटर जोड़ने के लिए, आपको .setter को संपत्ति ऑब्जेक्ट के सदस्य/विधि के रूप में उपयोग करना होगा, न कि property की स्थैतिक विधि/वर्ग विधि के रूप में। कोड ऐसा दिखाई माना जाता है:

class Table(object): 
    '''A CSV backed SQL table.''' 
    @property 
    def fieldnames(self): 
     with open(self.filename) as f: 
      return csv.DictReader(f).fieldnames 

    @fieldnames.setter # <<< 
    def fieldnames(self, fieldnames): 
     with open(self.filename, 'w') as f: 
      dr = csv.reader(f) 
      dw = csv.DictWriter(f, fieldnames=fieldnames) 
      dw.writerow(dict((field, field) for field in fieldnames)) 
      for row in self: 
       dw.writerow(row) 

इसके अलावा documentation में उदाहरण देखें।