开发者社区> 问答> 正文

使用延迟计算属性

你想将一个只读属性定义成一个property,并且只在访问的时候才会计算结果。 但是一旦被访问后,你希望结果值被缓存起来,不用每次都去计算。

展开
收起
哦哦喔 2020-04-17 15:04:30 862 0
1 条回答
写回答
取消 提交回答
  • 定义一个延迟属性的一种高效方法是通过使用一个描述器类,如下所示:
    
    class lazyproperty:
        def __init__(self, func):
            self.func = func
    
        def __get__(self, instance, cls):
            if instance is None:
                return self
            else:
                value = self.func(instance)
                setattr(instance, self.func.__name__, value)
                return value
    你需要像下面这样在一个类中使用它:
    
    import math
    
    class Circle:
        def __init__(self, radius):
            self.radius = radius
    
        @lazyproperty
        def area(self):
            print('Computing area')
            return math.pi * self.radius ** 2
    
        @lazyproperty
        def perimeter(self):
            print('Computing perimeter')
            return 2 * math.pi * self.radius
    下面在一个交互环境中演示它的使用:
    
    >>> c = Circle(4.0)
    >>> c.radius
    4.0
    >>> c.area
    Computing area
    50.26548245743669
    >>> c.area
    50.26548245743669
    >>> c.perimeter
    Computing perimeter
    25.132741228718345
    >>> c.perimeter
    25.132741228718345
    >>>
    仔细观察你会发现消息 Computing area 和 Computing perimeter 仅仅出现一次。
    
    2020-04-17 15:04:39
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多