装饰器

2021-08-12  本文已影响0人  慕知
装饰器
1) 示例:使用装饰器,判断程序运行的时间
#前提
import time
def index():
    print('hello word lalala')
    time.sleep(3) # 假如这个程序需要运行3s

index()






#方案一:修改了源代码(不可)
import time
def index():
    start=time.time()
    print('hello world lalala')
    time.sleep(3)
    stop=time.time()
    print(stop-start)

index()
# hello world lalala
# 3.0051140785217285     # 设定的时间3s













# 方案2:反复写代码,反复一串代码调用
import time
def index():
    print('hello world lalala')
    time.sleep(3)

start=time.time()
index()
stop=time.time()
print(stop-start)

















# 方案3:基于方案2,把调用的那一串代码定一个函数,直接调用函数
# 缺点:写死了调用的函数,只能调用index,执行index函数的那一串代码;而且改变了调用方式,不再是调用index()
import time
def index():
    print('hello world lalala')
    time.sleep(3)

def wrapper():
    start=time.time()
    index()
    stop=time.time()
    print(stop-start)

wrapper()
# hello world lalala
# 3.005214214324951













# 方案4:
import time
def index():
    print('hello world lalala')
    time.sleep(3)

def outter(func):        #func是一个参数(这里的参数是一个函数),就不会把上面的indx函数写死
    def warpper():
        start=time.time()
        func()            # 调用参数(即一个函数)
        stop=time.time()
        print(stop-start)
    return warpper        # return返回warpper,其实执行outter这个函数就是调用wrapper

index=outter(index)          #index可以起其他任意名字,但是还是叫index,就不会改变调用方式
print(index)
# <function outter.<locals>.warpper at 0x1007af790>   # 调用的函数地址(注意这里不是原来的index的函数值,是wrapper的内存地址)
index()
# hello world lalala
# 3.0009541511535645








# 方案5:(最终方案)  (加入了参数,源代码额返回值也会返回,给用户还是在用源代码的感觉)
import time
def index(x,y,z):
    print('hello world lalala')
    time.sleep(3)
    return x,y,z

def outter(func):
    def wrapper(*args,**kwargs):
        start=time.time()
        res=func(*args,**kwargs)
        stop=time.time()
        print(stop-start)
        return res
    return wrapper

index=outter(index)
res=index(1,2,3)        #res可以随便定义
print(res)
# hello world lalala
# 3.005371332168579
# (1, 2, 3)      # 返回值一起得到(相当于源代码执行结果一样)





# 以上如果要调用其他的函数,调用一样功能查看运行时间,只需要如下
调用函数名=outter(调用函数名)
res=函数名(参数)
print(res)

2) 总结 -- 装饰器
## 百搭装饰器
# def outter(func):
#     def wrapper(*args,**kwargs):
#         res=func(*args,**kwargs)
#         return res
#     return wrapper




from functools import wraps

def outter(func):
    @wraps(func)
    def wrapper(*args,**kwargs):
        inp_name=input('username:')
        inp_pwd=input('password:')
        if inp_name == 'mz' and inp_pwd == '123':
            res=func(*args,**kwargs)
            return res
        else:
            print('认证失败')
    return wrapper

@outter      # 相当于home=outter(home)
def home(name):        # 这里的name给 print('hello %s' % name) 使用返回值用
    res='这是home函数'
    print('hello %s' % name)
    return [res]



res=home('mz')
print(res)
# username:mz
# password:123
# hello mz
# ['这是home函数']




res=home('egon')
print(res)
# username:mz
# password:123
# hello egon
# ['这是home函数']




res=home('bb')
print(res)
# username:bbbbbbb
# password:123456
# 认证失败
# None


上一篇 下一篇

猜你喜欢

热点阅读