资讯专栏INFORMATION COLUMN

python之lazy property

SoapEye / 2279人阅读

摘要:今天看文章看到一个很神奇的东西,那就是文章之主题。中的符装饰被装饰了。。。当第一次执行的时候先被类初始化并赋给其实例变量然后再被函数执行并将返回值赋给变量,被通过内置函数将属性加入实例中,最后返回。

今天看文章看到一个很神奇的东西,那就是文章之主题——lazy property。自己也百度了好几篇文章,琢磨了一会儿才明白其中之奥秘,分享给大家。
python中的@符

def outter(func):
    def inner(*args, **kwargs):
        print("装饰a....")
        re=func(*args, **kwargs)
        return re   

    return inner
@outter
def a():
    print("被装饰了。。。")

a()

上面一段装饰器的代码,相信大家都明白其原理,通过装饰器a指向了outter的返回值,也就是其内部函数inner,然后调用a,其实调用的是被装饰后的函数。那么接下来,引入我们今天的话题lazy property.

class lazy(object):
    def __init__(self, func):
        self.func = func
 
    def __get__(self, instance, cls):
        val = self.func(instance)    #其相当于执行的area(c),c为下面的Circle对象
        setattr(instance, self.func.__name__, val)
        return val
 
class Circle(object):
    def __init__(self, radius):
        self.radius = radius
 
    @lazy
    def area(self):
        print("evalute")
        return 3.14 * self.radius ** 2
 
c = Circle(4)
print(c.area)
print(c.area)
print(c.area)   #三次的结果都是:50.24

上面的代码引用自飘逸的python,其不仅用到了我们上面的@符作用,更是用到了昨天讲的属性描述器。当第一次执行的时候先被lazy类初始化并赋给其实例变量func,然后再被__get__函数执行并将返回值赋给变量val,被通过python内置函数setter()将area属性加入c实例中(c.__dict__),最后返回val。这种方式可以简化我们的计算操作。
最后给大家扩展一个小知识点(见名之意我就不多嘴了):
setter(object,name,value)
getter(object,name, not_exists_value)
hasattr(object,name)
只想踏踏实实的学好一门语言,有不足的地方,大家多多留言提出来,谢谢了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42769.html

相关文章

  • Python 延迟初始化(lazy property

    摘要:延迟初始化主要用于提高性能,避免浪费计算,并减少程序的内存需求。实现延迟初始化有两种方式,一种是使用描述符,另一种是使用修饰符。 Python 对象的延迟初始化是指,当它第一次被创建时才进行初始化,或者保存第一次创建的结果,然后每次调用的时候直接返回该结果。 延迟初始化主要用于提高性能,避免浪费计算,并减少程序的内存需求。 property 在切入正题之前,我们了解下property的...

    J4ck_Chan 评论0 收藏0
  • Python中类的属性具有惰性求值的能力

    摘要:更多描述可见文档这种惰性求值的方法在很多模块中都会使用,比如中的使用上与例子一致,如表单中的讨论在大部分情况下,让属性具有惰性求值能力的全部意义就在于提升程序性能。当不需要这个属性时就能避免进行无意义的计算,同时又能阻止该属性重复进行计算。 起步 我们希望将一个只读的属性定义为 property 属性方法,只有在访问它时才进行计算,但是,又希望把计算出的值缓存起来,不要每次访问它时都重...

    NervosNetwork 评论0 收藏0
  • vue源码分析系列响应式数据(三)

    摘要:并在内执行了函数,在函数内部,访问了。至此知道了它依赖于。需要根据最新的计算。本例中收集到了依赖并且也被告知观察了他们。文章链接源码分析系列源码分析系列之环境搭建源码分析系列之入口文件分析源码分析系列之响应式数据一源码分析系列之响应式数据二 前言 上一节着重讲述了initData中的代码,以及数据是如何从data中到视图层的,以及data修改后如何作用于视图。这一节主要记录initCo...

    shenhualong 评论0 收藏0
  • Hibernate的延迟加载

    摘要:非集合属性非集合属性的延迟加载相对比较复杂。仅通过注解是无法实现延迟加载的。但是在一对一关系中,延迟加载是有陷阱的。这样一来,就会立即为配置延迟加载的实体生成一个动态代理类。 Hibernate中,延迟加载针对属性类别可以分为两类,一类是延迟属性加载,另一类是延迟关联实体加载。 属性延迟加载 属性有可以分为两种类型:一种是集合属性,一种是非集合属性(如String、Integer……)...

    jollywing 评论0 收藏0
  • vue源码响应式数据

    摘要:分析是如何实现数据响应的前记现在回顾一下看数据响应的原因之前看了和的源码他们都有自己内部的也就是实例使用的都是的响应式数据特性及所以决定看一下的源码了解是如何实现响应式数据本文叙事方式为树藤摸瓜顺着看源码的逻辑走一遍查看的的版本为目的明确 分析vue是如何实现数据响应的. 前记 现在回顾一下看数据响应的原因. 之前看了vuex和vue-i18n的源码, 他们都有自己内部的vm, 也就是...

    learn_shifeng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<