今天看文章看到一個很神奇的東西,那就是文章之主題——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