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

相關文章
相關標籤/搜索