python装饰器(二)

函数附加多个装饰器

# 多层装饰器
USER_INFO = {}    # 使用一个全局的字典,存储一些状态

def check_login(func):
    """
    检查登陆装饰器
    :param func:
    :return:
    """
    def inner(*args,**kwargs):
        if USER_INFO.get(‘is_login‘):  # 判断USER_INFO键对应值是否为真,为真状态已登录
            ret = func(*args,**kwargs)
            return ret
        else:
            print(‘请登录...‘)
    return inner

def check_admin(func):
    """
    检查是否为管理员
    :param func:
    :return:
    """
    def inner(*args,**kwargs):
        if USER_INFO.get(‘user_type‘) == 2: # 判断USER_INFO键对应值是否为2,是2位管理员
            ret = func(*args,**kwargs)
            return ret
        else:
            print(‘无权限查看‘)
    return inner

@check_login
def home():
    print(‘home‘)

def login():
    user = input("请输入用户名")
    if user == ‘admin‘:
        USER_INFO[‘is_login‘] = True
        USER_INFO[‘user_type‘] = 2
    else:
        USER_INFO[‘is_login‘] = True
        USER_INFO[‘user_type‘] = 1

@check_login
@check_admin
def index():
    print(‘Index‘)

if __name__ == ‘__main__‘:
    while True:
        inp = input("1.登录;2.查看;3.管理员")
        if inp == ‘1‘:
            login()
        elif inp == ‘2‘:
            home()
        elif inp == ‘3‘:
            index() 

# 程序简要说明:
# 1. 使用check_login装饰器判断是否已登录
# 2. 使用check_admin装饰器判断是否为管理员
# 3. 主要介绍装饰器功能,所以主函数简单点,当用户输入“1”为登陆,登陆后可“查看”,登陆用户为admin可使用“管理员”
# 然后我们在上一节已经了解到装饰器概念:被装饰器装饰的函数,在运行时会以参数的方式将函数整体传入到装饰器函数中,并将装饰器函数中的内层函数重新赋值给被装饰的函数
# 所以,在这里同样的适用,这里我们拿被装饰了两层装饰器的函数index,以上代码我们依次传入装饰器,将会这样执行

# 1. 首先,函数会被传入离它“最近”的check_admin装饰器,index将会变成这样:
@check_login
def index():
    if USER_INFO.get(‘user_type‘) == 2:
        print("Index")
        return None
    else:
        print(‘无权限查看‘)
# 注意:
#     第一,这里我的index并没有参数,所以你要这样拆分理解解释器时,函数有参数一定要传入参数
#     第二,index本身函数也简单,并没有return值,但是在函数中,没有任何返回,返回的就是None

# 2. 然后,函数再此被以参数的方式传入到check_login装饰器,index将会变成这样
def index():
    if USER_INFO.get(‘is_login‘):
        if USER_INFO.get(‘user_type‘) == 2:  #-+
            print("Index")                                #   |
            return None                                   #   |---这里部分就是上一步的内容
        else:                                                  #   |
            print(‘无权限查看‘)                           # -+
        return None
    else:
            print(‘请登录...‘)

# 或者,这里嵌套的有点繁琐,那我们就把第一步比作“1”
def index():
    if USER_INFO.get(‘is_login‘):
        1
        return None
    else:
            print(‘请登录...‘)

# 这样的多层函数就会理解得更清晰
时间: 2024-12-18 16:22:04

python装饰器(二)的相关文章

python 装饰器 二 (装饰带参数的函数)

#!/usr/bin/env python #_*_coding=utf-8_*_ #Author: xieyixue #mail: [email protected] #Created Time: 2015年07月01日 星期三 00时28分03秒 def deco(func): '''定义装饰器接受参数,参数为被装饰的函数 ''' def _deco(*arg, **kwarg): '''定义方法执行被装饰的函数,接受2个参数''' #执行前-->执行 print("before&qu

python装饰器系列(二)

对python装饰器系列(一)的deco函数进行修改: 1 def deco(fn): 2 def wrap(): 3 print('ha ha ha') 4 print('call {0} funtion'.format(fn.__name__)) 5 fn() 6 return wrap 1 @deco 2 def myfun(): 3 print('call myfun') 1 myfun() 2 3 ha ha ha 4 call myfun funtion 5 call myfun m

Python装饰器由浅入深

装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们以装饰函数为例子介绍其用法.要理解在Python中装饰器的原理,需要一步一步来.本文尽量描述得浅显易懂,从最基础的内容讲起. (注:以下使用Python3.5.1环境) 一.Python的函数相关基础 第一,必须强调的是python是从上往下顺序执行的,而且碰到函数的定义代码块是不会立即执行它的,只

python装饰器Decorators

http://blog.csdn.net/pipisorry/article/details/41902599 Introduction 装饰器Decorators是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能.装饰器用于在不改变原函数代码的情况下修改已存在的函数.常见场景是增加一句

Python装饰器、迭代器&生成器、re正则表达式、字符串格式化

Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########

遥想大肠包小肠----python装饰器乱弹

说起装饰器就tm蛋疼,在老男孩学习python装饰器,结果第二天默写,全错了,一道题抄十遍,共计二十遍. 要是装饰器是一人,我非要约他在必图拳馆来一场...... 下面容我展示一下默写二十遍的成果 语法形式 def  mydec(wenwa): def inner(*args,**kwagrs): ret = wenwa(*args,**kwargs) return ret  #请务必别忘记这还有个该死的return,如果被执行的函数没有返回值return,则ret为None return in

Day5 python装饰器

一.python装饰器基本概念 定义:本质是函数,用来装饰其他函数,即为其他函数添加附加功能. 原则:1.不能修改被装饰函数的源代码:    2.不能修改被装饰函数的调用方式. 实现装饰器的知识储备: 1.函数即"变量". 2.高阶函数 a.把一个 函数名 当作实参传给另一个函数: b.返回值中包含 函数名 . 3.嵌套函数 即在用def定义一个函数的函数体中再用def定义函数. 高阶函数 + 嵌套函数 => 装饰器 二.函数即"变量" 定义一个变量 1 x

Python学习:10.Python装饰器讲解(一)

情景介绍 一天,在你正在努力加班的时候,老板给交给你了一个任务,就是在这段代码里将所有函数开始输出一个'hello'最后输出当前时间,再输出一个"end",这段代码里包含了大量的函数,你会怎么做? def f1(): print('proces a') def f2(): print('proces b') def f3(): print('proces c') def f4(): print('proces d') ... ... 刚拿到这个任务,我们可能想着这样做,在每个函数中添加

python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变

Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用.写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring.废话不多说,上俩栗子就能搞明白! 实例一: 不加wraps # -*- coding=utf-8 -*- from functools imp