首页 > 其他分享 >属性惰性求值

属性惰性求值

时间:2023-12-08 21:44:25浏览次数:20  
标签:__ instance self print radius 惰性 func 求值 属性

问题

将一个只读的属性定义为property属性方法,只有在访问它时才参与计算。
但是,一旦访问了该属性,我们希望把计算的值缓存起来,不要每次访问它时都重新计算。

解决方案


class lazyproperty:
    def __init__(self, func):
        self.func = func
        
    def __get__(self, instance, cls):
        """
        当被访问的属性不在底层的实例字典中时,__get__()方法才会被调用
        第一次访问时,给实例设置了属性和值,
        第二次访问时,直接从实例字典中获取,没有访问__get__()方法
        """
        print("instance: ", instance)
        print("cls: ", 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) -> None:
        self.radius = radius
        
    @lazyproperty   # lazyproperty(area)
    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
    

if __name__ == '__main__':
    c = Circle(4.0)
    # print(c.radius)
    print(c.area)
    print(c.area) # 第二次打印时直接从实例字典从获取

标签:__,instance,self,print,radius,惰性,func,求值,属性
From: https://www.cnblogs.com/weiweivip666/p/17889108.html

相关文章

  • mapping映射属性
    索引库就类似数据库表,mapping映射就类似表的结构。mapping是对索引库中文档的约束,常见的mapping属性包括:type:字段数据类型,常见的简单类型有:字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)数值:long、integer、short、byte、double、float、布尔:boolean......
  • 【SQLServer2019备份恢复】查询本身有问题、未正确设置 "ResultSet" 属性、未正确设置
    在SQLServer2019AlwaysOn节点备份策略失败:备份数据库(完整)(8502-HIS-SQLAG\HISAG)备份数据库所在的位置:本地服务器连接兼容性级别为70(SQLServer7.0版)的数据库将被跳过。数据库:所有用户数据库类型:完整追加现有任务开始:2023-12-08T14:10:07。任务结束:20......
  • 3.3.6 条件属性
    一、属性介绍选中单元格后,点击「条件属性>添加条件」,可添加条件属性。属性介绍如下表:二、详细操作https://help.fanruan.com/finereport/doc-view-218.html?source=0&from=base......
  • Java 通过反射获取注解属性信息以及状态中字典
    一、创建存储对象importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;/***属性对象存储类*/publicclassMetadataField{/***key对应对象中间的属性*/privateStringkey;/***字......
  • java中的关键字transient,将不需要序列化的属性前添加关键字transient,序列化对象的时候
    java中的关键字transient,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化这个关键字的作用其实我在写java的序列化机制中曾经写过,不过那时候只是简单地认识,只要其简单的用法,没有深入的去分析。这篇文章就是去深入分析一下transient关键字。先......
  • ofd批注支持<ofd:Rotate>非标准的页面旋转属性
    boolannot_has_outerbox=true;autoboundary=apparence->GetAttribute(L"Boundary");if(boundary.GetStringLength()<=0){boundary=elem->GetAttribute(L"Boundary");if(boundary.Get......
  • 转置原理与多项式多点求值
    终于学转置原理了,之前一直听zhy糊多项式题不知道他在讲写啥。自己的多项式水平长期停留在多项式除法,直到今天做互测时被迫学了怎么去多点求值。正式比赛大概率不考(吧?)所以学来娱乐一下。普通多点求值算法思想很妙,效率很逊。代码不写了因为我连多项式取模都忘了怎么写了。考虑......
  • vue 的标签内属性的各使用形式
    标签内属性形式在Vue中,v-xx、@xx和:xx是不同的语法形式,具有不同的用途和语义v-xx形式:这是用于注册或使用Vue提供的内置指令或自定义指令。v-是Vue指令的前缀,后面跟着指令的名称例如,内置指令:v-if可以根据条件控制元素的显示和隐藏,v-for可以用于循环渲染列表,......
  • VS属性配置
    目的:使vs在使用opencv库或Qt插件时,将基本属性放在默认路径下,当前项目所需要特殊属性放在当前工程中,实现基本属性的通用与特殊属性的定制也方便工程中的同类功能的属性表移植.1vs+opencv基本属性配置准备工作:opencv在系统环境变量中的配置完毕1.1创建属性列表VS默认......
  • HTML学习笔记七:html-字符实体和全局属性
    HTML学习笔记七:html-字符实体和全局属性MDN元素查询地址所有的html的元素我们都可以通过以下地址进行相关的查询和理解。https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/meta字符实体用特定代码来表示一个符号,即为字符实体。字符实体格式:以&开头以;结尾......