VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • python基础教程之装饰器

第一种方法:

 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()


相关教程