【问题标题】:descriptor 'getter' requires a 'property' object but received a 'function'描述符“getter”需要一个“属性”对象,但收到了一个“函数”
【发布时间】:2011-11-14 12:53:24
【问题描述】:

所以我在下面有一个 Table 对象的代码,它有一个字段名的属性。

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)

当我尝试导入文件时,出现错误:

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'

谁能解释一下这个错误是什么意思?

【问题讨论】:

    标签: python properties decorator setter


    【解决方案1】:

    我猜它相当于TypeError: unbound method ... must be called with ... instance as first argument (got ... instance instead)。要通过装饰器向属性添加 setter,您必须使用 .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 中的示例。

    【讨论】:

      猜你喜欢
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多