python 装饰器
Python 装饰器
装饰器的作用:装饰器的作用就是为已经存在的对象,在不影响对象本身代码的同时,对其添加额外的功能。
装饰器原理:将原函数封装到一个新函数内,在新函数中会在原函数执行前后执行某些代码,并且返回原函数的返回值。
不带参数的装饰器
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017/11/13 0013 13:53 # @Author : ming def func1(f): # 将原函数的函数名作为参数传递,对于本例传递的函数名就是f1 def func2(): # 定义一个新的函数,其内部包含我们附加的代码,并且调用原函数。 print "我是在函数执行之前附加的功能" # 这是我们在原函数执行之前增加的额外功能 r = f() # 此处调用原函数,这里的f()函数,就是我们传递进来的f1()函数 print "我是在函数执行之后附加的功能" # 这是我们在原函数执行之后增加的额外功能 return r # 返回原函数的返回值给func1 return func2 # 返回原函数的返回值 r 给调用者 @func1 # 调用装饰器 def f1(): # 原函数 print "我是原函数实现的功能" return "我是原函数的返回值" print f1() #运行结果 我是在函数执行之前附加的功能 我是原函数实现的功能 我是在函数执行之后附加的功能 我是原函数的返回值
带固定长参数的装饰器
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017/11/13 0013 13:53 # @Author : ming def func1(f): # 将原函数的函数名作为参数传递,对于本例传递的函数名就是f1 def func2(x, y): # 定义一个新函数,新函数需要定义和被装饰函数相同数量的形参数量 if x % 2 == 0 and y % 2 == 1: # 在原函数之前执行的功能 r = f(x, y) # 执行原函数 print "good" # 在原函数之后执行的功能 return r # 返回原函数的返回值 else: return "输入不合法" return func2 # 将新函数作为返回值返回 @func1 # 调用装饰器 def f1(x, y): # 原函数 return x * y print ("f1(110, 3)结果: %s \n" % f1(110, 3)) #调用函数 print ("f1(111, 3)结果: %s \n" % f1(111, 3)) #调用函数 # 运行结果 good f1(110, 3)结果: 330 f1(111, 3)结果: 输入不合法
带不定长参数的装饰器
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017/11/13 0013 13:53 # @Author : ming def func1(f): # 将原函数的作为参数传递 def func2(*args, **kwargs): # 新函数 print "hello" # 在原函数之前执行 r = f(*args, **kwargs) # 原函数 print "end" # 在原函数之后执行 return r # 返回原函数的返回值 return func2 # 将新函数作为返回值返回 @func1 # 装饰器 def f1(x, y, c): # 原函数 print x + y + c f1(1, 2, 4) @func1 # 装饰器 def f2(x, y): # 原函数 print x + y f2(1, 2, ) #运行结果 hello 7 end hello 3 end
多个装饰器装饰一个函数
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017/11/13 0013 13:53 # @Author : ming def func1(f): def func2(*args, **kwargs): print "hello" r = f(*args, **kwargs) print "end" return r return func2 def func2(f): def func2(*args, **kwargs): print "HELLO" r = f(*args, **kwargs) print "END" return r return func2 @func2 # 先执行func2装饰器 @func1 # 在执行func2装饰器 def f1(x, y, c): print x + y + c return "我是原函数返回值" print f1(1, 2, 4) #运行结果 HELLO hello 7 end END 我是原函数返回值
未完待续。。。。