python属性和新的类样式

时间:2014-01-07 03:30:36

标签: python python-3.x properties python-2.x

我尝试使用属性装饰器和它的setter就像流动的

class Circle:

    def __init__(self, radius=0):
        self.__radius = radius 

    @property
    def radius(self):
        return self.__radius

    @radius.setter
    def radius(self, radius):
        if (radius > 0):
            self.__radius = radius
        else:
            raise ValueError

c = Circle()
c.radius = -1

但是在python 2.x中没有发生任何事情 只有python 3.x才能引发ValueError。

但是,我发现了post 帖子建议使用新的类风格(继承对象),
但我不知道新课堂风格的哪些特点让它起作用 我想知道属性和对象之间的关系。

1 个答案:

答案 0 :(得分:3)

属性是描述符。 The documentation描述描述符功能“来自”的位置:

  

对于对象,机器位于object.__getattribute__(),将b.x转换为type(b).__dict__['x'].__get__(b, type(b))

属性不适用于旧式类,因为旧式类不从object继承,并且正如引用所述,使描述符工作的机制由{{1}提供}。

没有直接的方法将此功能添加到旧式类中,因为object也不适用于旧式类。您必须存储一些单独的属性字典,然后使用__getattribute__映射属性访问它们。但是,没有理由这样做,因为没有理由不每次都使用新式的类。