python装饰器学习笔记

此生再无相见时 提交于 2020-01-13 05:00:57

什么是装饰器?为什么要使用装饰器?

使用装饰器可以让给我们的函数在执行之前或者执行之后添加一些代码,举个例子,当我们使用CSDN写博客或者编辑我们的个人资料的后台肯定要先判断我们是否登录,如果不使用装饰器,我们就必须要在写博客这个函数write_article()和edit_user()这两个函数的开头写分别一段代码判断是否已经登录,当功能较多时,这样是非常难以维护的。

装饰器代码举例

user = {
    'is_login':True
}
#装饰器的使用


def login_required(func):
    #装饰器
    def wrapper(*args,**kwargs):
        if user['is_login'] == True:
            func(*args,**kwargs)
        else:
            print('跳转到登录页面')
    return wrapper

@login_required
def write_atrticle(title,content):
    """
    用于模拟写博客
    """
    print('博客发表成功,标题:{},内容:{}'.format(title,content))

@login_required
def edit_user(uesr_name):
    """
    用于模拟编辑个人信息
    """
    print('个人信息编辑程功,新的同户名:{}'.format(uesr_name))

edit_user('lihua')
#个人信息编辑程功,新的同户名:lihua
write_atrticle('blog','hello,world!')
#博客发表成功,标题:blog,内容:hello,world!

传参数的装饰器

#给装饰器传递参数
user = {
    'is_login':False
}

def login_required(site = 'front'):
    #装饰器
    def outter_wrapper(func):
        def inner_wrapper(*args,**kwargs):
            if user['is_login'] == True:
                func(*args,**kwargs)
            else:
                if site == 'front':
                    print('跳转到前台登录页面')
                else:
                    print('跳转到后台登录界面')
        return inner_wrapper
    return outter_wrapper

@login_required('inner')
#login_required('inner')执行后返回outter_wrapper,相当于@outter_wrapper
def write_atrticle(title,content):
    """
    用于模拟写博客
    """
    print('博客发表成功,标题:{},内容:{}'.format(title,content))

@login_required('front')
def edit_user(uesr_name):
    """
    用于模拟编辑个人信息
    """
    print('个人信息编辑程功,新的同户名:{}'.format(uesr_name))

edit_user('lihua')
#跳转到前台登录页面
write_atrticle('blog','hello,world!')
#跳转到后台登录界面

wraps装饰器的使用

使用wraps装饰器可以使被装饰器装饰的函数的__name__属性不发生变化,用法如下:

from functools import wraps
user = {
    'is_login':True
}
#装饰器的使用


def login_required(func):
    #装饰器
    @wraps(func)
    def wrapper(*args,**kwargs):
        if user['is_login'] == True:
            func(*args,**kwargs)
        else:
            print('跳转到登录页面')
    return wrapper

@login_required
def write_atrticle(title,content):
    """
    用于模拟写博客
    """
    print('博客发表成功,标题:{},内容:{}'.format(title,content))

@login_required
def edit_user(uesr_name):
    """
    用于模拟编辑个人信息
    """
    print('个人信息编辑程功,新的同户名:{}'.format(uesr_name))


print(edit_user.__name__)
#edit_user,若不使用wraps装饰器则会打印wrapper
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!