python之lazy property

今天看文章看到一个很神奇的东西,那就是文章之主题——lazy property。本身也百度了好几篇文章,琢磨了一下子才明白其中之奥秘,分享给你们。
python中的@符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)
只想踏踏实实的学好一门语言,有不足的地方,你们多多留言提出来,谢谢了。code

相关文章
相关标签/搜索