首页 > 其他 > 详细

装饰器

时间:2020-08-19 13:07:18      阅读:69      评论:0      收藏:0      [点我收藏+]

装饰器:在不改变原函数的代码以及调用方式的前提下,为其增加新的功能。

    完全遵循开放封闭原则

    装饰器就是一个函数,本质是:闭包

python做了一个优化,提出了一个语法糖的概念

标准形式的装饰器:

  1.语法糖概念 2. 原函数有返回值 3. 原函数有单个或多个参数

import time


def func_timer(f):   # func_timer装饰器  # f:被装饰的函数
    def inner(*args, **kwargs):  # *:聚合

        start_time = time.time()

        ‘‘‘之前是访问被装饰函数之前的操作,功能‘‘‘
        ret = f(*args, **kwargs) # *:打散  # 如果原函数有返回值,要在这里接收它
        ‘‘‘下面是这里是访问被装饰函数之后的操作,功能‘‘‘

        end_time = time.time()
        print(f测试函数:{f},耗时:{end_time - start_time})

        return ret

    return inner


@func_timer   # ==> index = func_timer(index) # 这里实际上是读取该行与下一行
def index(name):  # 原函数
    """
    这里有很多代码
    """
    time.sleep(2) # 模拟的网络延迟或者执行代码耗费的时间
    print(f欢迎{name}登录博客园!)

    return 666

ret1 = index(天帝) # inner(‘天帝‘)  没有改变原函数调用方式和代码,并为其增加了函数执行效率的测试功能
print(ret1)


@func_timer
def dary(age, name):
    """
    这里有很多代码
    """
    time.sleep(3)
    print(f{age}的{name}来到了日记界面)

dary(18, LGQ)

 带参数的装饰器:

import time

def logger(n):

    def deco_func(f):
        def inner(*args, **kwargs):

            ret = f(*args, **kwargs)
            with open(f{n}.txt, encoding=utf-8, mode=a) as f1:
                t = time.strftime(%Y %m %d %H-%M-%S, time.localtime())
                msg = f{t}调用了{f.__name__}\n
                f1.write(msg)

            return ret

        return inner

    return deco_func


"""
带参数的装饰器就是在原本的装饰器基础上在最外层套一层函数,然后return原本装饰器的函数名
1.ret = logger(‘auth_Log‘)
2.ret = deco_func
3.@ret 即 @deco_func
4.login = deco_func(login)
5.login = inner
6.login() 即 inner()
"""
@logger(auth_log)
def login():
    print("登录逻辑")


@logger(auth_log)
def register():
    print("注册逻辑")


@logger
def show_goods():
    print("查看所有的商品信息")


@logger
def add_goods():
    print("商品加入购物车")


login()
register()

 

装饰器

原文:https://www.cnblogs.com/GOD-L/p/13528555.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!