推广

python设计模式5装饰器

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

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://www.0291.com.cn/post/57444.html

相关文章

拼多多怎么邀请拼单?教你三大秘诀轻松搞定!

拼多多怎么邀请拼单?教你三大秘诀轻松搞定!

随着社交电商的兴起,拼多多这个国内领先的社交电商平台也日益受到大家的关注。在拼多多上购物,不仅能享受到优惠的价格,还能体验到拼单的乐趣。那么,拼多多怎么邀请拼单呢?别急,接下来我将为你揭秘三大秘诀,让你轻松搞定拼单邀请! 我们要了解拼多多的拼单机制。在拼多多上,每个商品页面都会显示“...

思维方式决定一个人能走多远,厉害的人,大多身上都有这3种本质

有这3种方式的人,往往很厉害,早晚会发达前言:我们每个人的思维方式与格局都不尽相同,这些都不是我们出生所决定的,而是通过后天的能力处事慢慢沉淀所得到。有一些人看上去无所事事,碌碌无为,但是他们在你看不到的时候会悄悄的成功,甚至让你刮目相看。很多人都感觉这种人一定是被天上掉下...

美容店如何用抖音快手拓客,引流顾客到店

当下,短视频如火如荼,抖音和快手流量巨大,店也要跟上时代趋势做抖音和快手自媒体账号,如果你的抖音和快手账号粉丝越多,你的生意就会越来越好。如果再利用美克拉美容院管理系统的营销工具,就可以对抖音,快手短视频平台的客户资源进行精细化管理,倍增您的客户转化率。美克拉营销工具  做...

加强营销策划,让密云旅游品牌深入人心

加强,让密云深入人心提升密云“山水田园、画境密云”旅游品牌知名度和美誉度,让密云旅游品牌深入人心。一是聘请高端专业团队。与具有大型文旅运作经验的知名设计团队、营销团队寻求合作,挖掘好密云的生态资源和厚重历史,策划打造特色文旅产品,如以古北口抗战史、密云水库建设史等题材打造大...

支付宝集五福营销策略(2022年支付宝集五福攻略)

支付宝集五福营销策略(2022年支付宝集五福攻略)

昨天小编简短的整理了,各大平台春节集福、集卡、集分的瓜分活动,今天小编重点讲述一下支付宝集五福的活动,并收集了一些攻略,毕竟春节集福已经形成了一种节日情怀,而且这种瓜分活动,目前也成为了各大主流平台的推崇团宠。 多的不说,少的不唠,讲重点,2022年的支付宝集福活动于2022年1月18日开始了。感...

网站设计需要重点展示的元素。

网站设计需要重点展示的元素。

网站设计需要重点展示的元素 网站建设销售市场一直存在,网站建设公司的技术水平参差不齐,有先进的定制网站设计,但也有一般的网站建设。价格差异也很大。展示专业的视觉设计体验,然后根据不同的需求展示不同的网站服务项目。 网站设计需要重点展示的元素? 1.建立并突出品牌形象设计 每个网站都...

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

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