装饰器的概念
- 装饰器的实现是函数里面嵌套函数;
- 装饰器的本质是一个函数, 它可以让其他函数在不需要做任何代码改动的前提下增加额外的功能;
- 装饰器需要传递一个函数, 返回值也是一个函数对象.
"""
importfunctoolsdefrequired_types(*kinds):
defrequired_ints(fun):
@functools.wraps(fun)
def wrapper(*args, **kwargs):
for i in args:
if not isinstance(i, kinds):
print 'TypeError:参数必须为',kinds
break
else:
res = fun(*args, **kwargs)
return res
return wrapper
return required_ints
@required_types(float,float)
def add(a, b):
return a + b
print add(1.1,3)
6、多个装饰器的顺序
defdecorator_a(func):print'Get in decorator_a'definner_a(*args, **kwargs):print'Get in inner_a'
res = func(*args, **kwargs)
return res
return inner_a
defdecorator_b(func):print'Get in decorator_b'definner_b(*args, **kwargs):print'Get in inner_b'
res = func(*args, **kwargs)
return res
return inner_b
# 当有多个装饰器时,从下到上调用装饰器@decorator_b@decorator_adeff(x):print'Get in f'return x * 2
f(1)
7、多个装饰器的应用
在我们实际的应用场景中,会采用多个装饰器先验证是否登陆成功再验证权限
import functools
import inspect
defis_root(fun):@functools.wraps(fun)defwrapper(*args, **kwargs):# inspect.getcallargs返回值是字典,key值为:形参 value值:形参对应的实参
inspect_res = inspect.getcallargs(fun, *args, **kwargs)
print'inspect_res的返回值:%s' % inspect_res
if inspect_res.get('name') == 'root':
res = fun(*args, **kwargs)
return res
else:
print'Error:no permisson add studnet'return wrapper
login_session = ['root', 'admin', 'redhat']
defis_login(fun):@functools.wraps(fun)defwarrper(*args, **kwargs):if args[0] in login_session:
res = fun(*args, **kwargs)
return res
else:
print'Error:%s未登陆!' % args[0]
return warrper
@is_login@is_rootdefadd_student(name):print'添加学生信息。。'
add_student('root')