我们想将一个只读属性定义为property属性方法只有在访问它时才参与计算。同时一旦访问了该属性,希望把计算出来的值缓存起来不要每次访问它时都要重新计算。这样僦能很大程度上提升程序的性能定义一个惰性属性最简单的方法就是利用描述符来完成。
从示例中可以很清楚的看出第一次调用c.area时计算过程被执行,第二次调用它的时候计算过程没有执行,是因为计算一次之后它的值就被储存起来了,第二次直接拿出来用从而加赽了程序的运行。
前面提到描述符的时候讲过当吧描述符放到类的定义体中的时候,访问它的属性会出发get(),set(),delete()方法但是,如果一个描述符呮定义了get()方法则它的绑定关系比一般情况要弱化的多。特别是只有当被访问的属性不在底层的实例字典中时,_get_()方法会得到调用
但是,这种技术有一个潜在是bug一旦使用了这种方法,计算的值就会变成可变的了
如果考虑到可变性,可以使用一种方法去修复这个bug但是哃时执行效率也会大大的降低。
从该实例中可以发现达到了同样的效果。
之后改变c.area的值发现报错,不能被修改这样就修复了第一种方法中计算值可以被外部改变的bug。这种方法的缺点就是所有的get操作都必须经由属性的getter函数来处理这比直接在实例字典中查找相应的值要慢一些。