2011-09-10 32 views
5

aldı Bu yüzden bir Tablo nesnesi için aşağıdaki kodum var ve alan adları için bir özelliğe sahip.tanımlayıcısı 'getter' bir 'özellik' nesnesi gerektirir, ancak bir 'işlev'

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' 

herkes bu hata ne anlama geldiğini açıklayabilir: Ben dosyayı almaya çalıştığınızda

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) 

, ben hata alıyorum?

cevap

16

Bu, TypeError: unbound method ... must be called with ... instance as first argument (got ... instance instead) eşdeğeridir. Bir dekoratöre, bir dekoratör ile bir özellik eklemek için, property'un statik yöntemi/classmethod olarak değil, özellik nesnesinin bir üyesi/yöntemi olarak .setter'u kullanmanız gerekir. Kod şöyle bakmak gerekiyordu:

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) 

Ayrıca documentation örneğe bakın.

İlgili konular