十九、装饰器讲解
2018-10-23 本文已影响79人
十柒年
1.前言
在实际的项目开发过程中,我们可能会遇到一个这样的问题,就是在用户没有登录的情况下,点击一些按钮,要么提示用户没有登录,要么就是跳转到登录页面,如果页面这样的按钮少还好,如果按钮很多的话,直接把用户有没有登录的判断放到按钮里就不太合适了,这里咱们需要一个东西叫装饰器,看完这篇文章自己就可以写装饰器了。
2.代码部分
咱们先来看两个函数
def run():
print('hello world')
print('run')
def add(a,b):
c = a + b
print('hello world')
print('结果是:', c)
在这两个方法中,我们看到,一个有参数,一个没有参数,但是两个方法都需要输出hello world,咱们的装饰器就先这样写。
from functools import wraps
def my_log(func):
# 防止函数名称被偷换
@wraps(func)
def wrapper(*args,**kwargs):
print('hello world')
func(*args,**kwargs)
return wrapper
这里记几个笔记:
1.装饰器其实就是一个函数,同时他有两个特别之处
2.参数是一个函数
3.返回值是一个函数
在上面这个装饰器中,
- 1.导出wraps目的是为了防止函数名被偷换。比如说你传进去run然后执行下
print(run.__name__)
会发现函数名被替换成了wrapper,
- 2.
*args,**kwargs
组合到一块可以接受零个或者多个参数,这样不管你传过来的方法是有参数还是无参数,都可以执行。 - 3.返回值是一个函数 千万不要返回
wrapper()
哦。 - 4.装饰器使用时使用@符号放到函数上面。例如
@my_log
def run():
print('run')
好了,做笔记的完整代码如下。供参考使用。
from functools import wraps
# 装饰器实际上就是一个函数
# 有两个特别之处
# 1.参数是一个函数
# 2.返回值是一个函数
# 在打印run之前,先要打印一个hello world
# 在所有的函数执行之前 都要打印一个hello world
# 1.装饰器使用是通过@符号,放在函数的上面
# 2.装饰器中定义的函数,要使用*args 和 **kwargs两兄弟。并且在这个函数中执行原始函数的时候也要把*args,**kwargs传进去。
# 3.需要使用functools.wraps,在装饰器中的函数上把传进来的函数进行一个包裹,这样就不对丢失原来的函数的__name__ 等属性
def my_log(func):
# 防止函数名称被偷换
@wraps(func)
def wrapper(*args,**kwargs):
print('hello world')
func(*args,**kwargs)
return wrapper
@my_log
def run():
print('run')
print('-'*10)
print(run.__name__)
print('-'*10)
@my_log
def add(a,b):
c = a + b
print('结果是:', c)
Study hard and make progress every day.
更多学习资料请关注"爱游戏爱编程"。
爱游戏爱编程.jpg