python 装饰器

作用:提到代码的重用性,可以在不改变原函数代码的前提下,为该函数增加新的功能
应用场景:权限校验,日志处理

注:装饰器返回函数对象或者类对象。装饰器是一个函数或者类,谁调用它就可以用它的功能。 注: *args, **kwargs #
args是一个数组,kwargs一个字典

需求1: 用户登陆验证的装饰器is_login
1). 如果用户登陆成功, 则执行被装饰的函数;
2). 如果用户登陆不成功, 则执行登陆函数

需求2: 判断登陆用户是否未管理员is_admin(此处管理员只有一个为:admin用户)
1).如果用户为管理员, 则执行被装饰的函数;
2).如果用户不是管理员, 则报错;

import functools
 
login_users = ['admin', 'root']
 
 
def is_admin(fun):
    @functools.wraps(fun)
    def wrapper(*args, **kwargs):
        if kwargs.get('name') == 'admin':
            res = fun(*args, **kwargs)
            return res
        else:
            return 'error'
 
    return wrapper
 
 
def is_login(fun):
    @functools.wraps(fun)
    def wrapper(*args, **kwargs):
        if kwargs.get("name") in login_users:
            res = fun(*args, **kwargs)
            return res
        else:
            res = login()
            return res
 
    return wrapper
 
 
@is_admin
@is_login
def writeBlog(name):
    return "编写博客"
 
 
def login():
    return "登陆..."
 
 
print(writeBlog(name='admin'))
# 注:functools.wraps,wraps本身也是一个装饰器,
它能把原函数的元信息拷贝到装饰器里面的 func 函数中,
这使得装饰器里面的 func 函数也有和原函数一样的元信息了。

问题:如何给函数添加日志

import functools
import time
 
 
def log(fun):
    @functools.wraps(fun)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        res = fun(*args, **kwargs)
        end_time = time.time()
        print(time.ctime(), fun.__name__, (end_time - start_time), res)
        return res
 
    return wrapper
 
@log
def sum(x, y):
    time.sleep(1)
    return x + y
 
 
print(sum(2, 1))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值