美文网首页
通过描述符实现懒加载

通过描述符实现懒加载

作者: 高峥 | 来源:发表于2023-04-12 17:30 被阅读0次
class lazy(object): 
  def __init__(self, func): 
    self.func = func   #lazy的实例属性func等于area方法对象
  
  def __get__(self, instance, cls): 
    val = self.func(instance) #调用area方法计算出结果
    setattr(instance, self.func.__name__, val) #将结果设置给c的area属性
    return val 
  
class Circle(object): 
  def __init__(self, radius): 
    self.radius = radius 
  
  @ lazy  #area = lazy(area) lazy描述符
  def area(self): 
    print 'evalute'
    return 3.14 * self.radius ** 2
  
c = Circle(4) 
print c.radius 
print c.area 
print c.area 
print c.area 

结果'evalute'只输出了一次。在lazy类中,我们定义了get()方法,所以它是一个描述符。当我们第一次执行c.area时,python解释器会先从c.dict中进行查找,没有找到,就从Circle.dict中进行查找,这时因为area被定义为描述符,所以调用get方法。
get()方法中,调用实例的area()方法计算出结果,并动态给实例添加一个同名属性area,然后将计算出的值赋予给它,相当于设置c.dict['area']=val。
当我们再次调用c.area时,直接从c.dict中进行查找,这时就会直接返回之前计算好的值了。
原文链接:https://blog.csdn.net/azsx02/article/details/77649527

相关文章

  • Angular4-lazyload懒加载

    在Angular4中实现懒加载html、js、css等资源。利用Angular CLI实现懒加载,通过loadCh...

  • background-image和 img区别

    1.能否懒加载:background-image无法使用懒加载,而img标签可以通过设置其src进行懒加载的实现 ...

  • webpack打包代码实现

    webpack模块加载 异步模块加载 通过 import()实现指定模块的懒加载操作 懒加载的核心原理就是创建js...

  • swift学习09(懒加载)

    swift中是通过专门的关键字(lazy)来实现懒加载; 一、直接懒加载赋值 二、懒加载赋一个函数 三、懒加载赋一...

  • lazy

    swift中是通过专门的关键字(lazy)来实现懒加载; 直接懒加载赋值 懒加载赋一个函数 懒加载赋一个闭包 1、...

  • Swift 如何实现懒加载

    通过懒加载来实现从相册或拍照添加图片1、声明懒加载属性imagePickerController 2、显示相册和拍...

  • jquery 回到顶部、懒加载、无限加载

    懒加载的实现思路,避免所有图片在网页加载时全部加载而影响网页性能,通过按需加载来实现 【1】图片加载前,目标位置图...

  • viewpager+fragment的懒加载和缓存页面优化

    一, 懒加载实现,1,创建LazyFragment, 是懒加载的fragment, 要实现完全意义的懒加载, 我试...

  • 通俗易懂实现Fragment懒加载

    Fragment懒加载的实现思路: 1.主要是通过 ==setUserVisibleHint(boolean is...

  • 十二、类的加载

    懒加载类: 别人不动,我不动 非懒加载类: 通过+load 提前加载 我们可以到平时懒加载通过消息转发触发 ,所以...

网友评论

      本文标题:通过描述符实现懒加载

      本文链接:https://www.haomeiwen.com/subject/pnrxxrtx.html