【问题标题】:Python property does not setPython 属性未设置
【发布时间】:2012-06-01 10:06:27
【问题描述】:

代码如下:

def Property(func):
     return property(**func())

class A:
     def __init__(self, name):
          self._name = name

     @Property
     def name():
          doc = 'A''s name'

          def fget(self):
               return self._name

          def fset(self, val):
               self._name = val

          fdel = None

          print locals()
          return locals()

a = A('John')
print a.name
print a._name
a.name = 'Bob'
print a.name
print a._name

以上产生以下输出:

{'doc': 'As name', 'fset': <function fset at 0x10b68e578>, 'fdel': None, 'fget': <function fget at 0x10b68ec08>}
John
John
Bob
John

代码取自from here

问题:怎么了?它应该很简单,但我找不到。

注意:我需要属性来进行复杂的获取/设置,而不是简单地隐藏属性。

提前致谢。

【问题讨论】:

  • 您是否 100% 确定 fset 没有设置 name 而不是 _name?容易犯的错误,并会解释你的症状..
  • @MartijnPieters 99.9% 我刚刚复制了代码和这段代码产生的输出 =)
  • 有什么理由用这种奇怪的方式定义属性而不是仅仅使用@property def name(...): "docstr" \n getter, @name.setter def name(...): setter
  • @delnan 这是他链接到的教程...
  • @delnan 原因是有一个大的def 而不是两个(或三个,或四个)小的def

标签: python properties


【解决方案1】:

documentation for property() 声明:

返回新样式类(从对象派生的类)的属性属性。

你的类不是新式类(你不是从对象继承的)。将类声明更改为:

class A(object):
    ...

它应该按预期工作。

【讨论】:

  • 请注意,在 Python 3.x 下,默认情况下所有类都是新样式的,所以这不会成为问题(尽管从 object 继承并没有什么坏处)。
  • 哇它好用!我对属性 did 正确获取值这一事实感到更加困惑,所以我不知道是 property 函数本身失败了。
【解决方案2】:

(在上面发布)使用这种格式: http://docs.python.org/library/functions.html#property

class C(object):
    def __init__(self):
        self._name = "nameless"

    @property
    def name(self):
        """I'm the 'name' property."""
        return self._name

    @name.setter
    def name(self, value):
        self._name = value

    @name.deleter
    def name(self):
        del self._name

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多