推广

python设计模式5装饰器

iseeyu3年前 (2023-11-16)推广131

Django框架中有大量装饰器

  • 限制某些HTTP请求对视图的访
  • 控制
  • 按单个视图控制压缩
  • 基于特定HTTP请求头控制缓存

Pyramid框架和Zope应用服务器也使用装饰器来实现各种目标。

  • 将函数注册为事件订阅者
  • 以特定权限保护一个方法
  • 实现适配器模式

应用

装饰器模式在跨领域方面大放异彩:

  • 数据验证
  • 缓存
  • 日志
  • 监控
  • 调试
  • 业务规则
  • 加密

使用修饰器模式的另一个常见例子是(Graphical User Interface,GUI)工具集。在GUI工具集中,我们希望能够将一些特性,比如边框、阴影、颜色以及滚屏,添加到组件/控件。

实例

所有的递归函数都可以从缓存中受益,所以让我们尝试返回前n个数字之和的函数number_sum()。

def number_sum(n): 
    '''Returns the sum of the first n numbers''' 
    assert(n >= 0), 'n must be >= 0' 
    
    if n == 0:
        return 0
    else:
        return n + number_sum(n-1)  
 
if __name__ == '__main__': 
    from timeit import Timer 
    t = Timer('number_sum(30)', 'from __main__ import number_sum')
    print('Time: ', t.timeit())

执行输出耗时:Time: 34.952999532999456

下面的代码中,我们使用dict来缓存已经计算好的和。我们还改变了传递给number_sum()函数的参数。我们想计算前300个数字的和,而不是只计算前30个。

sum_cache = {0:0}
  
def number_sum(n): 
    '''Returns the sum of the first n numbers''' 
    assert(n >= 0), 'n must be >= 0'
    
    if n in sum_cache:
        return sum_cache[n]
    res = n + number_sum(n-1)
    # Add the value to the cache
    sum_cache[n] = res
    return res
         
if __name__ == '__main__': 
    from timeit import Timer 
    t = Timer('number_sum(300)', 'from __main__ import number_sum')
    print('Time: ', t.timeit())

执行输出耗时:Time: 1.2133596080002462。快了但是单码复杂了,且不方便复用。改用lru_cache装饰器会更清晰:

from functools import lru_cache

@lru_cache
def number_sum(n): 
    '''Returns the sum of the first n numbers''' 
    assert(n >= 0), 'n must be >= 0' 
    
    if n == 0:
        return 0
    else:
        return n + number_sum(n-1)  
 
if __name__ == '__main__': 
    from timeit import Timer 
    t = Timer('number_sum(30)', 'from __main__ import number_sum')
    print('Time: ', t.timeit())

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://0291.com.cn/post/57444.html

相关文章

淘宝店侦探怎么查看(店侦探怎么看数据)

淘宝店侦探怎么查看(店侦探怎么看数据)

但是这个数据是不可靠的,因为你自己刷新一次在线人数就增加一个,所以说如果大家发现在线人数很多先不要太高兴,可能只是你自己多刷新了几次。...

你一定不能错过的渠道推行技巧和转化率优化方案!

你一定不能错过的渠道推行技巧和转化率优化方案!

常常有企业会问,这个月花了很多钱,那么广告费究竟哪去了?抛开针对促销活动或是大型公关事情的暂时投放,惯例的流量引入是重中之重,也是确保平台新用户稳步增长的关键要素,假设如今给你一千万,你如何花的高效? 假如作为一家大型的互联网公司,自身就有一定的知名度及用户数,广告...

社区团购运营干货:教你六招(社区团购怎么做)

社区团购运营干货:教你六招(社区团购怎么做)

在社区团购系统中,团长是商家和潜在用户之间非常重要的纽带,团长的拉粉丝和卖货能力直接影响到商家的最终用户数量和收入。但是,由于很多团长半途而废,团长的能力就成为社区团购商家必须关注的重点。 那么社区团购平台可以从哪些方面入手来提升团长的拉粉能力和带货能力呢?广州赤焰信息今天就为大家分享几个实用的方...

教你SEO博客的写作意义是什么。

教你SEO博客的写作意义是什么。

我们为什么要做一个属于自己的seo?对于这个问题,大家都认真思考过吗?不排除有的朋友是人云亦云,看这别人都在做,自己也盲目的跟着做;或许也有的朋友是为了好玩,觉得很新鲜,同时也可以当作炫耀的资本——在互联网上有一个属于自己的个人网站能够满足一点点虚荣心。那么做SEO博客的到底在哪里?相信绝大多数的...

直播是当下移动互联网上最大的一块流量洼地,是否可以利用网红直播引流?

直播是当下移动互联网上最大的一块流量洼地,是否可以利用网红直播引流?

从目前看,网红主播对于卖货而言,对于品牌推广而言,噱头价值大于实际价值。 直播毫无疑问是当下移动互联网上最大的一块流量洼地。 有统计称电视收视率的下滑归根于直播的冲击。我们目前没有权威的统计去支撑这个论调。但是,直播的火热的确有目共睹,直播平台上有海量的流量也是不需要争论的事实。即将到...

什么是正确的搜索引擎优化过程。

什么是正确的搜索引擎优化过程。

很多新老站长都包含了很多SEO操作和实践的知识点,但没有一定的实现流程,他们完全按照自己的知识点来操作,那么SEO优化的正确流程是什么呢?本文将向您展示SEO优化的正确过程 搜索引擎优化的正确工作流程: 一、我们应当做些什么来优化新网站的排名? (1)新网站不包括在里面,首先要...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片