修饰器

2024.4.2 修饰器

简化

import time

def time_sleep():      #函数停止运行多长时间
    start = time.time()
    time.sleep(5)
    print('from time_sleep ')
    end = time.time()
    print(end - start)

time_sleep()

增加功能

import time

def time_sleep():      #函数停止运行多长时间
    time.sleep(1)
    print('from time_sleep ')


def time_count(func):   
    start = time.time()
    func()
    end = time.time()
    print(end - start)

time_count(time_sleep)    #改变调用方式,但是变得复杂

装饰器

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

装饰器的实现必须遵循两大原则:

  1. 不修改被装饰对象的源代码
  2. 不修改被装饰对象的调用方式

装饰器本身也是一种函数

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=deco(time_sleep)
time_sleep        #time_sleep()=wrapper(),加上()表示函数被调用,可以去掉,也可以删去(),要不然python3.9会报错

带参数的

import time

def time_sleep(name,age,gender='male',height=18):      #函数停止运行多长时间
    time.sleep(1)
    print('name:',name,'age:',age,'gender:',gender,'height',height)
    print('from time_sleep ')
    return 'adam'

def deco(func):    #装饰器
    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('ADAM','18')
print(res)

装饰器模板

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

语法糖

import time

def deco(func):    #装饰器
    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,gender='male',height=18):      #函数停止运行多长时间
    time.sleep(1)
    print('name:',name,'age:',age,'gender:',gender,'height',height)
    print('from time_sleep')
    return 'adam'

res=time_sleep('ADAM','20')
print(res)

登录装饰器

userinfo_dict={'adm':'111'}
is_login =False  #全局变量,所以使用global,改变变量
'''或者使用可变变量'''

def login(func):
   def wrapper(*args,**kwargs):
         global is_login
         if not is_login:
             username = input('用户名>>>').strip()
             pwd = input('密码>>>').strip()
             if pwd == userinfo_dict.get(username):
                 print('登陆成功')

                 is_login=True

             res=func(*args,**kwargs)
             return res
             print('登录失败')
         else:
             res = func(*args, **kwargs)
             return res

   return wrapper



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

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

shopping()
pay()

三层装饰器

def sanceng(name,age):
	def deco(func):
		print(name)
		def wrapper(*args,**kwargs):
			print(name)
			res=func(*args,**kwargs)
			return res
		return wrapper
	return deco

deco=sanceng(name,age)
time_sleep=deco(time_sleep)
time_sleep()	
posted @ 2024-04-02 19:43  adam12138  阅读(23)  评论(0)    收藏  举报