装饰器的练习

装饰器实战:权限控制与类型检查
本文介绍如何使用Python装饰器实现用户权限验证和参数类型检查,通过实例演示了多重装饰器的使用,包括管理员权限验证、用户登录状态检查及参数必须为指定类型的装饰器设计。

1.比如之前所写的管理员登陆系统,可以加上与用户之间的判定,这时候就可以用装饰器来完成

"""
['root','admin','redhat']
在实际的应用场景中,会采用多个装饰器先验证是否登陆成功,再验证权限是否足够
"""
import functools
import inspect

def is_admin(fun):
    @functools.wraps(fun)
    def zjs(*args,**kwargs):
        #inspect.getcallargs返回一个字典,key值:形参 value值:对应的实参
        insp_res = inspect.getcallargs(fun,*args,**kwargs)
        print('inspect的返回值是:%s' %(insp_res))
        if insp_res.get('name')=='root':
            res = fun(*args,**kwargs)
            return  res
        else:
            print('not root cannot to operate')
    return zjs


user_li=['admin','root','sjz']
def is_user(fun):
    @functools.wraps(fun)
    def ing(*args,**kwargs):
        if args[0] in user_li:
            res1 = fun(*args,**kwargs)
            return res1
        else:
            print('no, u cannot login')
    return ing

@is_user
@is_admin
def add(name):
    print('添加信息')

add('root')
add('sjz')
add('jay')

在这里插入图片描述

2.判断整形装饰器

"""
编写装饰器required_ints, 条件如下:
#     1). 确保函数接收到的每一个参数都是整数;
#     2). 如果参数不是整形数, 打印 TypeError:参数必须为整形
"""
import functools


def required_ints(fun):
    @functools.wraps(fun)
    def zjs(*args, **kwargs):
        for i in args:
            if not isinstance(i, int):
                print('TypeError:参数必须为整形')
                return
        res = fun(*args, **kwargs)
        return res

    return zjs


@required_ints
def add(a, b):
    print(a + b)

add(1,4)
add(1, 4.0)

在这里插入图片描述

外加参数装饰器
前面写的add_log装饰器打印函数日志信息,如果我们想要再添加信息的话,就可以用到外加参数装饰器

import functools
import time


def log(qqq):
    def add_log(fun):
        @functools.wraps(fun)
        def zjs(*args, **kwargs):
            start_time = time.time()
            res = fun(*args, **kwargs)
            end_time = time.time()
            print('<%s> [%s] 函数名:%s,运行时间:%.6f,运行返回值:%d'
                  % (qqq, time.ctime(), fun.__name__, end_time - start_time, res))
            return res

        return zjs

    return add_log


@log('debug')
def log(x, y):
    # time.sleep(1)
    return x * y


print(log(2, 5))

在这里插入图片描述

如图:它所打印出的日志信息多了这一项,为我们的外加参数

外加参数练习

"""
# 编写装饰器required_types, 条件如下:
#     1). 当装饰器为@required_types(int,float)确保函数接收到的每一个参数都是int或者float类型;
#     2). 当装饰器为@required_types(list)确保函数接收到的每一个参数都是list类型;
#     3). 当装饰器为@required_types(str,int)确保函数接收到的每一个参数都是str或者int类型;
#     4). 如果参数不满足条件, 打印 TypeError:参数必须为xxxx类型
"""
import functools


def required_types(*types):
    def required(fun):
        @functools.wraps(fun)
        def zjs(*args, **kwargs):
            for i in args:
                if not isinstance(i, types):
                    print('函数所有参数并非', types)
                    break
            else:
                res = fun(*args, **kwargs)
                return res

        return zjs

    return required


@required_types(int, float)
def add(*args):
    print(args)


add(1, 2, 3, 4, 5)
add('1','sjz')

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值