Python-开发之路-装饰器&多层装饰器简介

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34409701/article/details/51589736

抱歉,自己的拖延症导致好久都没补之前落下的...让我忏悔一会~~

python的装饰器,是为了不破坏已经写好的代码(函数)的封闭性,通过特定的格式,将已完成的函数重新加载,并在外层增加额外的处理,是个很好用的方法,简易代码及说明如下:

#!/usr/bin/env python
# _*_ coding=utf-8 _*_
#将下面需要到的标配统一化管理在代码开头的字典中,是一个比较聪明的做法~~~
LOGIN_INFO = {'is_login':False,
              'vip_login':1,
                            }
def outer(func):
    def inner(*args,**kwargs):
        print('log')
        r=func(*args,**kwargs)
        print('after')
        return r
    #注意此处返回的是一个函数体,而非一个函数,也就是说不是函数执行后的返回值,而是把加工后的inner作为原函数被装饰后的返回
    return inner

#   装饰器:@+函数
#   功能:1、自动执行函数outer,并将下面的函数体作为一个参数返回outer
#         2、将outer的返回值重新复制给下面被装饰的函数
@outer
def f1(arg):
    print(arg)
    return 'hello--------------'

if __name__ == '__main__':
    f1

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

当然如果需求变多了,也就出现了多层装饰器,简易代码及说明如下:

#!/usr/bin/env python
# _*_ coding=utf-8 _*_

def outer(func):
    def inner(*args,**kwargs):
        print('log')
        r=func(*args,**kwargs)
        print('after')
        return r
    return inner

def outer2(func):
    def inner(*args,**kwargs):
        if LOGIN_INFO['is_login']:
            r=func()
            return r
        else:
            print('please login')
    return inner

#如果套两层装饰器,就是双层装饰器了,当然也有三层,四层,道理类似
#这里大家可能有疑惑,python在解释有 “@+函数”这种格式的语法时,会自动从里向外解读,再从外向内执行,
#也就是最里层的原函数被逐层装饰直到最外层,对应例子里,python先把f2(原函数)发给outer2(里层装饰器),被装饰后的outer2的inner再
#被outer(外层装饰器)装饰,最终返回的是outer的inner函数体。
@outer
@outer2
def f2(a,v):
    print('F2')
#当然有人问主函数的调用为啥这样写呢,这个会在模块对于的blog中介绍

if __name__ == '__main__':
    f2

另外一个小实例

#!/usr/bin/env python
# coding:utf-8
#Author Allen Lee

UserInfo={}
UserInfo['is_login']=True
UserInfo['user_type']=2

def checktype(func):
    def inner():
        if UserInfo.get('user_type',None) == 2:
            ret = func()
            return ret
        else:
            print('you cannot checkinfo')
        return inner


def checklogin(func):
    def inner():
        if UserInfo.get('is_login',None) == True:
            ret = func()
            return ret
        else:
            print('please login first')
        return inner

#多层装饰器,关键点 编译是从下至上进行的,执行时是从上至下进行。

@checktype
@checklogin
def index():
    print('welcome')
    a=input('choose:1.userinfo;2.changeotherpasswd;3checkinfo')
    if a == '1':
        print('c')
    if a == '2':
        print('b')
    if a == '3':
        print('a')


index()




没有更多推荐了,返回首页