美文网首页Python基础系列红红火火恍恍惚惚
python之懒惰属性(延迟初始化)

python之懒惰属性(延迟初始化)

作者: 我爱学python | 来源:发表于2019-08-01 16:36 被阅读98次

 Python 对象的延迟初始化是指,当它第一次被创建时才进行初始化,或者保存第一次创建的结果,然后每次调用的时候直接返回该结果。延迟初始化主要用于提高性能,避免浪费计算,并减少程序的内存需求。

1. 温故下property

property可以将属性的访问转变成方法的调用

可以看到,area虽然是定义成一个方法的形式,但是加上@property后,可以直接执行c.area,当成属性访问。

现在问题来了,每次调用c.area,都会计算一次,太浪费cpu了,怎样才能只计算一次呢?这就是lazy property

2.lazy property实现

实现延迟初始化有两种方式,一种是使用python描述符,另一种是使用@property修饰符

方法1:

结果'evalute'只输出了一次。在lazy类中,我们定义了__get__()方法,所以它是一个描述符。当我们第一次执行c.area时,python解释器会先从c.__dict__中进行查找,没有找到,就从Circle.__dict__中进行查找,这时因为area被定义为描述符,所以调用__get__方法。

在__get__()方法中,调用实例的area()方法计算出结果,并动态给实例添加一个同名属性area,然后将计算出的值赋予给它,相当于设置c.__dict__['area']=val。

当我们再次调用c.area时,直接从c.__dict__中进行查找,这时就会直接返回之前计算好的值了。

方法2:

这里与方法1异曲同工,在area()前添加@lazy_property相当于运行以下代码:

lazy_property(area)

lazy_property()方法返回_lazy_property,_lazy_property又会调用_lazy_property()方法,剩下的操作与方法1类似。

相关文章

  • python之懒惰属性(延迟初始化)

    Python 对象的延迟初始化是指,当它第一次被创建时才进行初始化,或者保存第一次创建的结果,然后每次调用的时候直...

  • 8.Kotlin属性揭秘与延迟初始化特性

    1.属性 示例代码 运行结果 2.延迟初始化属性 延迟初始化属性Kotlin要求非空类型的属性必须要在构造方法中进...

  • Kotlin 入门中

    1、定义静态的成员变量,然后延迟初始化 lateinit:延迟初始化属性companion:伴生对象 2、swit...

  • Kotlin延迟初始化lateinit和by lazy的区别

    延迟初始化为什么要进行延迟初始化?kotlin中的属性在声明的同时必须初始化,否则会报错 private var ...

  • Kotlin学习笔记- 常量、变量

    1、后期初始化与延迟初始化 * 1.1、后期初始化属性 声明后期初始化属性的特点: 使用lateinit关键字必须...

  • Kotlin延迟初始化lateinit和by lazy的区别

    延迟初始化 为什么要进行延迟初始化? kotlin中的属性在声明的同时必须初始化,否则会报错 而我们有时候不想要声...

  • Kotlin学习笔记-延迟加载

    lazy:延迟加载 延迟初始化属性与变量 为处理这种情况,你可以用 lateinit 修饰符标记该属性: 该修饰符...

  • 属性及延迟初始化

    kotlin属性有一些 backing field 支撑字段(域) 在某些访问器中使用backing proper...

  • python 延迟加载

    延迟加载的目的: 节省一些初始化所需要的时间和空间Python里面的延迟加载用得非常多,其主要思想是延迟所要引入类...

  • kotlin—lateinit及其实现原理

    1、lateinit语法及其使用 lateinit用于延迟属性初始化的,语法如下所示: lateinit 它只能用...

网友评论

    本文标题:python之懒惰属性(延迟初始化)

    本文链接:https://www.haomeiwen.com/subject/fwlcdctx.html