Flask交流

十九、装饰器讲解

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.返回值是一个函数

在上面这个装饰器中,

print(run.__name__)

会发现函数名被替换成了wrapper,

@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
上一篇 下一篇

猜你喜欢

热点阅读