首先,提出一个需求:
创建一个装饰器auth,在不改变原函数的基础上,在执行的基础函数f1,f2,f3等几个函数时候,在f1,f2,f3等原函数的前后增加打印before和after的功能。
- 创建装饰器
# basic.py
#首先定义一个装饰器auth:
#一般装饰器
def auth(func):
def inner():
print 'before'
func()
print 'after'
return inner
#带1个参数的装饰器
def auth_arg(func):
def inner(arg):
print 'before'
func(arg)
print 'after'
return inner
#带多个参数的装饰器
def auth_args(func):
def inner(*arg, **kwargs):
print 'before'
func(*arg,**kwargs)
print 'after'
return inner
@auth
def f1():
print 'f1'
@auth
def f2():
print 'f2'
@auth
def f3():
print 'f3'
#使用带1个参数的装饰器
@auth_arg
def f4(arg):
print 'f4',arg
#使用带多个参数的装饰器
@auth_args
def f5(arg1,arg2,arg3,arg4):
print 'f5',arg1,arg2,arg3,arg4
2.另一个py文件调用这个装饰器
#test.py
#coding:utf-8
#!/usr/bin/env python
import basic
basic.f1()
basic.f2()
basic.f3()
#使用带1个参数的装饰器
basic.f4('123')
#使用带多个参数的装饰器
basic.f5('a','b','c','d')
3.最后效果:
$python test.py
before
f1
after
before
f2
after
before
f3
after
before
f4 123
after
before
f5 a b c d
after
# basic.py
#动态参数的装饰器
def auth(func):
def inner(*arg, **kwargs):
print 'before'
func(*arg,**kwargs)
print 'after'
return inner
@auth
def f1():
print 'f1'
@auth
def f2():
print 'f2'
@auth
def f3():
print 'f3'
@auth
def f4(arg):
print 'f4',arg
@auth
def f5(arg1,arg2,arg3,arg4):
print 'f5',arg1,arg2,arg3,arg4