装饰器

2019-05-22 06:34:12来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

第一种方法:

1
#加验证 2 def w1(Func): 3 def inner(): 4 print("正在验证权限") 5 Func() 6 return inner 7 def f1(): 8 print("...f1...") 9 def f2(): 10 print("...f2...") 11 f1= w1(f1) 12 f1()
 1 #加验证
 2 def w1(Func):
 3     print("正在装饰")
 4     def inner():
 5         print("正在验证权限")
 6         Func()
 7     return inner 
8 #只要解释器执行到了这个代码,那么就会自动的进行装饰,而不是等到调用的时候才装饰的 9 @w1 10 def f1(): 11 print("...f1...") 12 #在调用f1之前,已经进行装饰了 13 f1()

 使用装饰器对无参数的函数进行装饰

 1 def func(functionName):
 2     print("...func...1...")
 3     def func_in():
 4         print("...func_in...1...")
 5         functionName()
 6         print("...func_in...2...")
 7     print("...func...2...")
 8     return func_in
 9 @func
10 def test():
11     print("...test...")
12 
13 test()

使用装饰器对有参数的函数进行装饰

 1 def func(functionName):
 2     print("...func...1...")
 3     def func_in(a,b):#如果a,b没有定义,会导致14行的调用失败
 4         print("...func_in...1...")
 5         functionName(a,b)#如果没有把a,b当做实参进行传递,会导致调用11行函数失败
 6         print("...func_in...2...")
 7     print("...func...2...")
 8     return func_in
 9 @func
10 def test(a,b):
11     print("...test-a=%d,b=%d..."%(a,b))
12 
13 test(11,22)

使用装饰器对不定长参数的函数进行装饰

 1 def func(functionName):
 2     print("...func...1...")
 3     def func_in(*args,**kwargs):#如果a,b没有定义,会导致14行的调用失败
 4         print("...func_in...1...")
 5         functionName(*args,**kwargs)#如果没有把a,b当做实参进行传递,会导致调用11行函数失败
 6         print("...func_in...2...")
 7     print("...func...2...")
 8     return func_in
 9     print("...func...3...")
10 @func
11 def test(a,b,c):
12     print("...test-a=%d,b=%d,c=%d..."%(a,b,c))
13 @func
14 def test2(a,b,c,d):
15     print("...test-a=%d,b=%d,c=%d,d=%d..."%(a,b,c,d))
16 
17 test(11,22,33)
18 test2(11,22,33,44)

装饰器对有返回值的函数进行装饰

 1 def func(functionName):
 2     print("...func...1...")
 3     def func_in():
 4         print("...func_in...1...")
 5         ret=functionName()#保存返回来的haha
 6         print("...func_in...2...")
 7         return ret#把haha返回到17行的调用
 8     print("...func...2...")
 9     return func_in
10     
11 @func
12 def test():
13     print("...test...")
14     return "haha"
15 
16 
17 ret=test()
18 print("test return value is %s"%ret)

通用装饰器

 1 def func(functionName):
 2     def func_in(*args,**kwargs):
 3         print("记录日志")
 4         ret=functionName(*args,**kwargs)
 5         return ret
 6     return func_in
 7     
 8 @func
 9 def test():
10     print("...test...")
11     return "haha"
12 @func
13 def test2():
14     print("...test2...")
15 @func
16 def test3(a):
17     print("...test3-a=%d..."%a)
18 
19 ret=test()
20 print("test return value is %s"%ret)
21 
22 a = test2()
23 print("test2 return value is %s"%a)
24 
25 test3(11)

带有参数的装饰器

def func_arg(arg):
    def func(functionName):
        def func_in():
            print("记录日志")
            functionName()
        return func_in
    return func
#1.先执行func_arg("heihei")函数,这个函数的return 的结果是func这个函数的引用
#2.@func
#3.使用func对test进行装饰
@func_arg("heihei")#相当于@func
def test():
    print("...test...")

test()

 


原文链接:https://www.cnblogs.com/daxinzhe/p/10895123.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:2018 Python开发者大调查:Python和JavaScript最配?

下一篇:【Python爬虫】爬了七天七夜,终于爬出了博客园粉丝数排行榜!