属性fset函数没有被调用

时间:2016-05-08 18:52:21

标签: python python-2.7

我无法弄清楚我在这里做错了什么。我总是使用property( fget=fget, fset=fset )初始化托管类属性,并且我有一个内存,我的getter和我的setter都曾在Python 2和3中工作。现在,使用代码实际上直接来自{{3}我发现我的getter工作,但我的setter函数似乎在Python 2.x中被忽略了 - 对属性的赋值只是消除了它的属性并用vanilla属性替换它。但是,在Python 3.x中一切都很好。我究竟做错了什么?

class foo:
    def getcode( self ): return self.__code
    def setcode( self, value ): self.__code = value.upper()[ : 1 ]
    def delcode( self ): raise AttributeError( "cannot remove the 'code' property" )
    code = property( fget=getcode, fset=setcode, fdel=delcode, doc='A single upper-case character' )

    def __init__( self, code='A' ): self.setcode( code )

f = foo(); f.code = 'A'
print( f.code )         # expect 'A', get 'A'
f = foo(); f.code = 'bbb'
print( f.code )         # expect 'B' but python 2.7.10 prints 'bbb'
f = foo(); f.code = 5   # expect an exception but python 2.7.10 does not raise one 
print( f.code )  

1 个答案:

答案 0 :(得分:1)

默认情况下,Python 2.x类不会从object继承而来 区分旧样式类和新样式类 通过Python> 2.2。

property()是构建数据描述符的简洁方法,该数据描述符在访问属性时触发函数调用,但它完全起作用 文档here中仅描述了新式类:class has 继承自object