属性是类属性还是实例属性?

时间:2017-06-27 21:35:06

标签: python python-3.x

从坚果壳中的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()中即时计算   增加两边。

属性是类属性还是实例属性?

  1. 以上引用是否暗示属性是实例属性?

  2. 属性总是在类的定义中定义,属性是类属性。

  3. Rectangle.__dict__是否存储了类属性,而Rectangle实例的__dict__存储了实例属性?如果是,则以下内容显示该属性是类属性而不是实例属性:

  4.  
    >>> Rectangle.__dict__    
    mappingproxy({..., 'area': <property object at 0x7f34f7ee2818>})
    >>> r=Rectangle(2,3)
    >>> r.__dict__    {'width': 2, 'height': 3} 
    

1 个答案:

答案 0 :(得分:2)

property对象本身是一个类属性,因为它在类体内的位置意味着;但是,您仍然可以访问实例上的类属性,反之亦然。

该属性的不同之处在于descriptor protocol;在访问r.area的情况下,发生以下(大致):

  • Python在实例上查找属性,但找不到它;然后
  • Python在实例的类型中查找属性,并找到它;然后
  • Python发现结果值实现了__get__,所以;
  • Python使用实例和类调用该方法。

因此实际调用的是:

Rectangle.area.__get__(r, Rectangle)

这是属性描述符在实际成为类的属性时访问实例状态的方式;实例传递给它。你可以告诉它一个类属性,因为它可以在类上访问,而不创建任何实例:

>>> Rectangle.area
<property object at 0x...>