7.2 装饰器

7.2 装饰器

装饰器:装饰的工具,而工具又是由函数来定义。所以,装饰器本质上也是一个函数,只不过这个函数具有装饰功能。

import time

#睡眠1秒
def time_sleep():
    time.sleep(1)

#睡眠1秒打印1
time_sleep()
print(1)

#再睡眠1秒打印2
time_sleep()
print(2)
# print(time.time()) #打印当前时间

start =time.time()
time.sleep(5)
end =time.time()
print(end-start) #输出间隔时长
5.001065015792847
#将计算间隔时长功能写成函数,对time.sleep()计时.

def time_sleep():
    start =time.time()
    time.sleep(5)
    end =time.time()
    print('from time_sleep')
    print(end-start)
#每个函数如果都要统计间隔时长,这样写一遍太复杂
#因此基于上述代码改进

#定义计算执行间隔时长函数,传入函数类型参数,统计该函数间隔时长。
def time_count(func):
    start =time.time()
    func()
    end =time.time()
    print(end-start)
    
def time_sleep1():
    time.sleep(1)
    print('from time_sleep1')

def time_sleep2():
    time.sleep(2)
    print('from time_sleep2')
    
time_count(time_sleep1)
time_count(time_sleep2)
from time_sleep
1.0007519721984863
from time_sleep
2.0007483959198

虽然上述代码实现了新功能但却需要重新调用,便引入了装饰器。

装饰器:改变功能的时候不改变原来的调用方式,并且不改变原来函数的代码

7.2.1 基础装饰器

import time

def time_sleep():
    time.sleep(1)
    print('from time_sleep')

#最基础的装饰器
def deco(func):
    def wrapper():
        start =time.time()
        func()
        end =time.time()
        print(end-start)
    return wrapper

#添加装饰器后的time_sleep
time_sleep=deco(time_sleep) #wrapper

time_sleep() #wrapper()
from time_sleep
1.0006792545318604

7.2.2 完善装饰器

  1. 带有返回值的装饰器

import time

def time_sleep():
    time.sleep(1)
    print('from time_sleep')

    return  'timesleep'

def deco(func):
    def wrapper():
        start=time.time()
        res=func()
        end=time.time()
        print(end-start)
        return res
    return wrapper

time_sleep=deco(time_sleep)
res=time_sleep()
print(res)
from time_sleep
1.000774621963501
timesleep
  1. 带有参数的装饰器
#3.2 参数的
def time_sleep(name,age,height='185'):
    
    time.sleep(1)
    print('from time_sleep')
    print(f'name:{name},age:{age},height:{height}')
    return  'timesleep'

def deco(func): #func=原来的time_sleep
    def wrapper(*args,**kwargs):
        start=time.time()
        res=func(*args,**kwargs) #接收所有参数
        end=time.time()
        print(end-start)
        return res
        
    return wrapper
    
time_sleep=deco(time_sleep)
res=time_sleep('coco',18)
print(res)
from time_sleep
name:coco,age:18,height:185
1.0009222030639648
timesleep

7.2.3 装饰器补充

#装饰器模版

def  deco(func):
    def wrapper(*args,**kwargs):
        res=func(*args,**kwargs)

        return res

    
    return wrapper
#语法糖让代码写的简单

def deco(func): #func=原来的time_sleep
    def wrapper(*args,**kwargs):
        start=time.time()
        res=func(*args,**kwargs) #接收所有参数
        end=time.time()
        print(end-start)
        return res
        
    return wrapper

@deco #time_sleep=deco(time_sleep)
def time_sleep(name,age,height='185'):
    
    time.sleep(1)
    print('from time_sleep')
    print(f'name:{name},age:{age},height:{height}')
    return  'timesleep'

res=time_sleep('coco',18)
print(res)
from time_sleep
name:coco,age:18,height:185
1.000589370727539
timesleep

7.2.4 装饰器应用

# 模版
# def  deco(func):
#     def wrapper(*args,**kwargs):
#         res=func(*args,**kwargs)

#         return res

#     return wrapper

userinfo_dict={'coco':'123'}

is_login=False
# is_login_list=[False] #一般不用可变类型


#登录装饰器
def login(func):
    def wrapper(*args,**kwargs):
        global is_login #声明全局变量在局部第一次使用之前
        if not is_login:
            
            username=input('请输入你的用户名>>')
            pwd=input('请输入你的密码>>')
            
            if pwd==userinfo_dict.get(username):
                print('登陆成功')
                
                
                is_login=True
                
                # is_login_list[0]=True #局部无法修改规则不适用于可变类型,使用全局变量声明,不建议使用可变类型。
                
                res=func(*args,**kwargs)
                return res
            
            else:
                print('登录失败')
        else:
            res=func(*args,**kwargs)
            return res
        
    return wrapper

@login
def shopping():
    print('from shopping')

@login
def pay():
    print('from pay')

@login
def withdraw():
    print('from withdraw')


# shopping()

withdraw()
请输入你的用户名>> coco
请输入你的密码>> 123


登陆成功
from withdraw

7.2.5 三层装饰器

  • 三层装饰器:两层装饰器需要参数,给装饰器这个函数传参。
def time_sleep():
    time.sleep(1)
    print('from time_sleep')
    return 'time_sleep'

#三层装饰器
def sanceng(name): #第三层装饰器为了传参用
    print(name)
    def  deco(func):
        def wrapper(*args,**kwargs):
            res=func(*args,**kwargs)
    
            return res
    
        return wrapper
    return deco


deco=sanceng('coco')
time_sleep=deco(time_sleep)
time_sleep()
coco
from time_sleep

'time_sleep'
posted @ 2025-08-24 09:58  bokebanla  阅读(9)  评论(0)    收藏  举报