从坚果壳中的Python
属性是具有特殊功能的实例属性。 ...
以下是定义只读属性的一种方法:
class Rectangle(object): def __init__(self, width, height): self.width = width self.height = height def get_area(self): return self.width * self.height area = property(get_area, doc='area of the rectangle')
Rectangle类的每个实例r都具有合成只读 属性r.area ,在方法r.get_area()中即时计算 增加两边。
属性是类属性还是实例属性?
以上引用是否暗示属性是实例属性?
属性总是在类的定义中定义,属性是类属性。
Rectangle.__dict__
是否存储了类属性,而Rectangle
实例的__dict__
存储了实例属性?如果是,则以下内容显示该属性是类属性而不是实例属性:
>>> Rectangle.__dict__
mappingproxy({..., 'area': <property object at 0x7f34f7ee2818>})
>>> r=Rectangle(2,3)
>>> r.__dict__ {'width': 2, 'height': 3}
答案 0 :(得分:2)
property
对象本身是一个类属性,因为它在类体内的位置意味着;但是,您仍然可以访问实例上的类属性,反之亦然。
该属性的不同之处在于descriptor protocol;在访问r.area
的情况下,发生以下(大致):
__get__
,所以; 因此实际调用的是:
Rectangle.area.__get__(r, Rectangle)
这是属性描述符在实际成为类的属性时访问实例状态的方式;实例传递给它。你可以告诉它一个类属性,因为它可以在类上访问,而不创建任何实例:
>>> Rectangle.area
<property object at 0x...>