我尝试使用属性装饰器和它的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
帖子建议使用新的类风格(继承对象),
但我不知道新课堂风格的哪些特点让它起作用
我想知道属性和对象之间的关系。
答案 0 :(得分:3)
属性是描述符。 The documentation描述描述符功能“来自”的位置:
对于对象,机器位于
object.__getattribute__()
,将b.x
转换为type(b).__dict__['x'].__get__(b, type(b))
。
属性不适用于旧式类,因为旧式类不从object
继承,并且正如引用所述,使描述符工作的机制由{{1}提供}。
没有直接的方法将此功能添加到旧式类中,因为object
也不适用于旧式类。您必须存储一些单独的属性字典,然后使用__getattribute__
映射属性访问它们。但是,没有理由这样做,因为没有理由不每次都使用新式的类。