IP代理软件,http代理,API提取-黑洞HTTP

黑洞HTTP

您的位置: 首页 > 新闻资讯 > HTTP代理 > 正文

Python高级技巧:lazy property

发布时间:2019年07月09日 来源:互联网

  Python高级技巧:lazy property!Python 对象的延迟初始化是指,当它第一次被创建时才进行初始化,或者保存第一次创建的结果,然后每次调用的时候直接返回该结果。延迟初始化主要用于提高性能,避免浪费计算,并减少程序的内存需求。


Python高级技巧:lazy property


  property


  在切入正题之前,我们了解下property的用法,property可以将属性的访问转变成方法的调用。


  1class Circle(object):


  2 def __init__(self, radius):


  3 self.radius = radius


  4


  5 @property


  6 def area(self):


  7 return 3.14 * self.radius ** 2


  8


  9c = Circle(4)


  10print c.radius


  11print c.area


  可以看到,area虽然是定义成一个方法的形式,但是加上@property后,可以直接执行c.area,当成属性访问。


  现在问题来了,每次调用c.area,都会计算一次,太浪费cpu了,怎样才能只计算一次呢?这就是lazy property。


  lazy property


  实现延迟初始化有两种方式,一种是使用python描述符,另一种是使用@property修饰符。


  方式1:


  1class lazy(object):


  2 def __init__(self, func):


  3 self.func = func


  4


  5 def __get__(self, instance, cls):


  6 val = self.func(instance)


  7 setattr(instance, self.func.__name__, val)


  8 return val


  9


  10class Circle(object):


  11 def __init__(self, radius):


  12 self.radius = radius


  13


  14 @lazy


  15 def area(self):


  16 print 'evalute'


  17 return 3.14 * self.radius ** 2


  18


  19c = Circle(4)


  20print c.radius


  21print c.area


  22print c.area


  23print 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中进行查找,这时就会直接返回之前计算好的值了。


  不太懂python描述符的话,可以参考Descriptor HowTo Guide


  方式2


  1def lazy_property(func):


  2 attr_name = "_lazy_" + func.__name__


  3


  4 @property


  5 def _lazy_property(self):


  6 if not hasattr(self, attr_name):


  7 setattr(self, attr_name, func(self))


  8 return getattr(self, attr_name)


  9


  10 return _lazy_property


  11


  12class Circle(object):


  13 def __init__(self, radius):


  14 self.radius = radius


  15


  16 @lazy_property


  17 def area(self):


  18 print 'evalute'


  19 return 3.14 * self.radius ** 2


  这里与方法1异曲同工,在area()前添加@lazy_property相当于运行以下代码:


  1lazy_property(area)


  lazy_property()方法返回_lazy_property,_lazy_property又会调用_lazy_property()方法,剩下的操作与方法1类似。


  我们可以检查下是否真的延迟初始化了:


  1c = Circle(4)


  2print "before first visit"


  3print c.__dict__


  4c.area


  5print "after first visit"


  6print c.__dict__


  7


  8#输出结果为:


  9


  10before first visit


  11{'radius': 4}


  12evalute


  13after first visit


  14{'_lazy_area': 50.24, 'radius': 4}


相关文章内容简介

1 Python高级技巧:lazy property

  Python高级技巧:lazy property!Python 对象的延迟初始化是指,当它第一次被创建时才进行初始化,或者保存第一次创建的结果,然后每次调用的时候直接返回该结果。延迟初始化主要用于提高性能,避免浪费计算,并减少程序的内存需求。  property  在切入正题之前,我们了解下property的用法,property可以将属性的访问转变成方法的调用。  1class Circle(object):  2 def __init__(self, radius):  3 self.radius = radius  4  5 @property  6 def area(self):  7 return 3.14 * self.radius ** 2  8  9c = Circle(4)  10print c.radius  11print c.area  可以看到,area虽然是 [阅读全文]

热门标签

最新标签

推荐阅读

  1. 01

    2019-08

    电商们使用高匿代理ip刷单更有效果的原因是什么?

    在一些网络销售平台上存在的刷单现象是众所周知的,其实在如今来说,很多消费者都不觉得它是一种欺骗消费者的行为了,更多的能够展现自己的实力。因为当我们通过某著名电商平台去购物

  2. 14

    2019-06

    直播主播如何使用代理ip来增加人气和流量?

    现在直播的流量比较大,直播营销也是非常的流行的,有些主播为了自己自己直播间人气增加效果,不得不去做些投机取巧之人去做一下,协议人气,也就是俗称人机来冲人数,冲击在线水军,

  3. 18

    2019-05

    解析当下的代理IP软件市场现状

    笔者在一家软件开发公司上班,此前部门经理要求撰写一篇观代理IP软件如今发展状况的文章,我内心纳闷这该怎么写,如今的代理市场乱糟糟的,一地鸡毛一样的。最终经过多方面整理归纳

  4. 06

    2019-04

    代理IP如何帮助Python爬虫进行图片自动下载

    随着Python爬虫的问世,很多机械性的工作都能够省掉了,当要大批量爬取信息的时候,爬虫能够进行自动下载,大大的提升了工作效率。那么python爬虫如何实现图片自动下载的呢?怎么运用python

  5. 18

    2019-11

    Python爬虫的基本抓取网页

    爬虫在开发过程中也有很多复用的过程,这里先总结一下基本抓取网页和cookie处理方法,以后也能省些事情。

  6. 05

    2019-09

    选择代理IP或者动态VPS时的性价比对比

    很多朋友在购物时都是以价格为主要因素,就拿代理IP或者动态VPS来说,有免费的就不用收费的,有便宜的就不用更贵的。这样虽然降低了成本,但同时也降低了效率,在如今这个时代,效率永