装饰器及进阶

1、装饰器

装饰器的本质:一个闭包函数

装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展

 2、装饰不带参数的函数

 1 import time
 2 def timer(f):            #1
 3     def inner():         #4
 4         start=time.time()  #8
 5         f()                #9
 6         end=time.time()    #12
 7         print(end-start)   #13
 8 
 9     return  inner        #5
10 
11 @timer   #func=time(func)      #3     #6,func的地址变成了inner的内存地址
12 def func():              #2
13     time.sleep(1)        #10
14     print("你好,菜菜")  #11
15 
16 func()                   #7,这里其实是调用inner()

 3、装饰带参数的函数

 1 import time
 2 def timer(f):                 #1
 3     def inner(*args,**kwargs):   #4
 4         start=time.time()         #8
 5         f(*args,**kwargs)         #9
 6         end=time.time()           #12
 7         print(end-start)          #13
 8     return inner                    #5
 9 
10 @timer      #f=timer(f)                #3 #6,把inner的内存地址赋值给f
11 def f(a,b):                  #2
12     time.sleep(2)            #10
13     print("***",a,b)         #11
14 f(1,2)                            #7,调用f()实际是调用inner()

 4、打印函数名称及带返回值的装饰器

 1 import time
 2 from functools import wraps
 3 def timer(f):
 4     @wraps(f)    #给innner加带参数的装饰器,用来答应被装饰函数的函数名
 5     def inner(*args,**kwargs):
 6         start=time.time()
 7         ret=f(*args,**kwargs)
 8         end=time.time()
 9         print(end-start)
10         return ret
11     return inner
12 
13 @timer      #f=timer(f)
14 def f(a,b):
15     time.sleep(2)
16     print("***",a,b)
17     return '新年好'
18 
19 ret2=f(1,2)
20 print(ret2)   #将f()函数的返回值给打印出来~
21 print(f.__name__)   #如果不加@wraps(f),打印出来是inner的函数名

 5、装饰器统一格式

(1)无参数

 1 def wapper(func):
 2     def inner():
 3         '''在被装饰函数之前要做的事'''
 4         func()
 5         '''在被装饰函数之后要做的事'''
 6     return inner
 7 @wapper
 8 def f():
 9     '''要执行的部分'''
10 f()

(2)带参数

 1 def wapper(func):
 2     def inner(*args,**kwargs):
 3 
 4         '''在被装饰函数之前要做的事'''
 5         func(*args,**kwargs)
 6         '''在被装饰函数之后要做的事'''
 7     return inner
 8 
 9 @wapper
10 def f(a,b):
11     pass
12 
13 f(1,2)

 6、开放封闭原则

(1)对扩展是开放的

  为什么要对扩展开放呢?

  我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。

(2)对修改是封闭的

  为什么要对修改封闭呢?

  就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

  装饰器完美的遵循了这个开放封闭原则。

7、带参数的装饰器(三层装饰器),设置Flage来控制函数的执行

假如你有成千上万个函数使用了一个装饰器,现在你想把这些装饰器都取消掉,你要怎么做?

一个一个的取消掉? 没日没夜忙活3天。。。

过两天你领导想通了,再让你加上。。。

import time
Flage=True
def timmer_out(flag):
    def timer(f):
        def innner():
            if flag:
                start=time.time()
                f()
                end=time.time()
                print(end-start)
            else:
                ret=f()
                return ret
        return innner
  return timer @timmer_out(Flage)
def func(): time.sleep(1) print("你好啊,菜菜") func()

 

 8、多个装饰器修饰一个函数

 

 1 def wrapper1(func):
 2     def inner1():
 3         print('wrapper1 ,before func')
 4         func()
 5         print('wrapper1 ,after func')
 6 
 7     return inner1
 8 
 9 def wrapper2(func):
10     def inner2():
11         print('wrapper2 ,before func')
12         func()
13         print('wrapper2 ,after func')
14 
15     return inner2
16 
17 @wrapper2
18 @wrapper1
19 def f():
20     print('in f')
21 
22 f()
23 
24 #结果:
25 wrapper2 ,before func
26 wrapper1 ,before func
27 in f
28 wrapper1 ,after func
29 wrapper2 ,after func

 

转载于:https://www.cnblogs.com/caili/p/9690456.html

资源下载链接为: https://pan.quark.cn/s/9648a1f24758 这个HTML文件是一个专门设计的网页,适合在告白或纪念日这样的特殊时刻送给女朋友,给她带来惊喜。它通过HTML技术,将普通文字转化为富有情感和创意的表达方式,让数字媒体也能传递深情。HTML(HyperText Markup Language)是构建网页的基础语言,通过标签描述网页结构和内容,让浏览器正确展示页面。在这个特效网页中,开发者可能使用了HTML5的新特性,比如音频、视频、Canvas画布或WebGL图形,来提升视觉效果和交互体验。 原本这个文件可能是基于ASP.NET技术构建的,其扩展名是“.aspx”。ASP.NET是微软开发的一个服务器端Web应用程序框架,支持多种编程语言(如C#或VB.NET)来编写动态网页。但为了在本地直接运行,不依赖服务器,开发者将其转换为纯静态的HTML格式,只需浏览器即可打开查看。 在使用这个HTML特效页时,建议使用Internet Explorer(IE)浏览器,因为一些老的或特定的网页特效可能只在IE上表现正常,尤其是那些依赖ActiveX控件或IE特有功能的页面。不过,由于IE逐渐被淘汰,现代网页可能不再对其进行优化,因此在其他现代浏览器上运行可能会出现问题。 压缩包内的文件“yangyisen0713-7561403-biaobai(html版本)_1598430618”是经过压缩的HTML文件,可能包含图片、CSS样式表和JavaScript脚本等资源。用户需要先解压,然后在浏览器中打开HTML文件,就能看到预设的告白或纪念日特效。 这个项目展示了HTML作为动态和互动内容载体的强大能力,也提醒我们,尽管技术在进步,但有时复古的方式(如使用IE浏览器)仍能唤起怀旧之情。在准备类似的个性化礼物时,掌握基本的HTML和网页制作技巧非常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值