装饰器

作者: 慕知 | 来源:发表于2021-08-12 10:27 被阅读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


相关文章

  • 装饰器

    """@装饰器- 普通装饰器- 带参数的装饰器- 通用装饰器- 装饰器装饰类- 内置装饰器- 缓存装饰器- 类实现...

  • typescript 五种装饰器

    装饰器类型 装饰器的类型有:类装饰器、访问器装饰器、属性装饰器、方法装饰器、参数装饰器,但是没有函数装饰器(fun...

  • python——装饰器详解

    一、装饰器概念 1、装饰器 装饰器:一种返回值也是一个函数的函数,即装饰器。 2、装饰器目的 装饰器的目的:装饰器...

  • Python装饰器

    Python装饰器 一、函数装饰器 1.无参装饰器 示例:日志记录装饰器 2.带参装饰器 示例: 二、类装饰器 示例:

  • Python中的装饰器

    Python中的装饰器 不带参数的装饰器 带参数的装饰器 类装饰器 functools.wraps 使用装饰器极大...

  • 装饰器

    装饰器 decorator类装饰器 带参数的装饰器 举例(装饰器函数;装饰器类;有参与无参) https://fo...

  • TypeScript装饰器

    前言 装饰器分类 类装饰器 属性装饰器 方法装饰器 参数装饰器需要在tsconfig.json中启用experim...

  • python之装饰器模版

    装饰器的作用:装饰器即可以装饰函数也可以装饰类。装饰器的原理:函数也是对象 1.定义装饰器 2.使用装饰器假设de...

  • 装饰器实验

    装饰器实验 说明 ts内包含了四个装饰器,类装饰器、属性装饰器、函数装饰器、参数装饰器,本文中测试一下其的使用。 ...

  • python3基础---详解装饰器

    1、装饰器原理 2、装饰器语法 3、装饰器执行的时间 装饰器在Python解释器执行的时候,就会进行自动装饰,并不...

网友评论

      本文标题:装饰器

      本文链接:https://www.haomeiwen.com/subject/dkglbltx.html