python_装饰器/匿名函数

装饰器:

定义:本质是函数,(装饰其他函数)就为其他函数添加附加功能

原则:1.不能修改被修饰的函数源代码

     2.不能修改被修饰的函数的调用方式

实现装饰器知识储备:

1.函数即‘变量’

2.高阶函数

3.嵌套函数

高阶函数+嵌套函数=》装饰器 


import  time
def _time(func):
    star_time = time.time()
    time.sleep(3)
    return  func
    end_time=time.time()
    print(star_time-end_time)

def t():
    print(1)


t=_time(t)
t()
分析:这么写 return 后代码无法执行 只满足了装饰器的高阶函数的条件,改造一下如下

import time
def desc(func):
    def timer(*args,*kwargs):
        star_time =time.time()
        func(*args,*kwargs)
        end_time=time.time()
        print(end_time-star_time)
    return timer

@desc#te=desc(te)
def te():
    time.sleep(1)
    print(1)




#第一层装饰器传参数
def auth(auth_type):
    print("auth func:",auth_type)
    #第二层 传入方法的地址
    def outerwrapper(func):
        #第三层传入方法带参数
        def wrapper(*args,**kwargs):
            print(1)
            #判断传入的值
            if auth_type=='local':
                username=input('username:').strip()
                password=input('pwd').strip()
                if username=='1' and password=='2':
                    #接受返回的方法
                    res=func(*args,**kwargs)
                    print('--after authenticaion')
                    return  res
                else:
                    exit("\033[31;1mInvalid username or password\033[0m")
            elif auth_type=='ldap':
                print("python 这个代码反人类")
        #将最后一层的指向倒数第二层
        return wrapper
    #倒数第二层的指向最后一层
    return outerwrapper


@auth(auth_type="local")#auth=outerwrapper(auth) 因为返回的是函数outerwrapper的地址
def index():
    print('welcome')

@auth(auth_type="ldap")
def bbs():
    print("welcome to bbs  page")

index()
bbs()





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值