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. 09

    2019-05

    代理IP安全有保障吗?

    很多时候,互联网给我们带来了很多的便利,同时也给存在着很多漏洞和欺骗,稍微不注意电脑信息就会被丢失,非常的不安全,遇到这样的情况可以选择蚂蚁浏览器代理IP,这样一来安全性能

  2. 04

    2019-07

    如何控制爬虫的采集速度以防被封?

    我们都知道,如果爬虫一直快速的访问一个网站,会给网站服务器带来比较大的压力,这么明显的异常访问,网站人员肯定会检测到问题的。因此,为了能够持续的采集数据,这速度肯定是要控

  3. 18

    2019-02

    爬虫如何伪装用户发起请求?

    爬虫在采集网页数据的时候,很多信息都是伪装的,不然会被对方服务器识别到这是爬虫,并进行拦截。因此,爬虫需要模仿正常用户访问,把自己的信息都伪装好,这样才能成功的获取到网页

  4. 13

    2019-06

    代理ip哪家比较靠谱?

    如果需要大量的中国的代理ip,哪家是不错的呢?价格如何?质量如何?数量如何呢?多人都需要使用国内代理ip的,如果能找个不错的商家,这样用起来也是不错的。

  5. 25

    2019-09

    怎么使用手机ip代理软件?

    随着科技的发展,各种各式各样功能迥异的手机APP也不断开发上线,手机已逐渐方便人们的生活学习,同时手机也逐渐呈现超过了电脑趋势。这期间很值得探讨的是,那么多的用户在移动端进

  6. 26

    2019-10

    爬虫的IP被限制该怎么办?

    俗话说,拥有大数据的人,就是拥有财富的人。现代社会,使用爬虫爬取数据,是一项非常重要的手段。