zoukankan      html  css  js  c++  java
  • python -- 装饰器

    一、装饰器(Decorator)

    装饰器本质上也是一个函数,它可以为已设计好的函数增加额外的功能。

    装饰器的定义与普通函数的定义在形式上是类似的。

    不同的是装饰器必须传入一个函数对象作为参数,然后在装饰器中重新定义一个新的函数

    在这个函数中执行新增的操作,并对应的位置调用被装饰的函数。最后返回这个新定义的函数。

    既可以为多个函数添加同一个装饰器,也可以给一个函数添加多个装饰器。

    如果被装饰的函数带有参数,装饰器中的函数也需要添加相同数量的参数。

    无法确定具体的参数时,可以在装饰器函数中使用不定长参数。(*args, **kwargs) 元组&字典格式传入

    from datetime import date


    # -------------------------------------------
    # 装饰器(Decorator):给已设计好的函数增加额外的功能
    # -------------------------------------------
    # func:被装饰的函数名
    # inner:装饰完的函数名
    def prefix(func):
    # 装饰器函数
    def inner(): #这里是装饰器新定义的函数,原来的功能
    print("今天的日期是:")
    return func() #返回的是today()函数的内容
    return inner


    @prefix #添加新的功能,保持原有的函数名不变,today是在原有装饰器上被装饰的函数
    def today():
    print(date.today())


    # today = prefix(today)
    today() # 由于有装饰器,执行debug后,单个执行会跳转到innner()函数中;与函数today()名相同,调用today函数


    # -----------------------------------
    # 给多个函数添加相同的装饰器
    # -----------------------------------
    def add_confirm(func):
    def confirm():
    print("您确认要执行下面的操作吗:")
    return func()
    return confirm


    @add_confirm
    def f1():
    print('新增记录')


    @add_confirm
    def f2():
    print('删除记录')


    @add_confirm
    def f3():
    print('修改记录')


    f1()
    f2()
    f3()

    print()


    # --------------------------------
    # 被装饰函数具有相同的参数个数
    # --------------------------------
    def add_confirm1(func):
    # 传入相应长度的参数列表
    def confirm(arg):
    print("您确认要执行下面的操作吗:")
    return func(arg)
    return confirm


    @add_confirm1
    def fun1(arg1):
    print('新增记录:', arg1)


    @add_confirm1
    def fun2(arg1):
    print('删除记录:', arg1)


    @add_confirm1
    def fun3(arg1):
    print('修改记录:', arg1)


    fun1(1005)
    fun2(1003)
    fun3(1002)
    print()


    # --------------------------------
    # 被装饰函数具有不同的参数个数
    # --------------------------------
    def add_confirm2(func):
    # 传入不定长参数
    def confirm(*args, **kwargs):
    print("您确认要执行下面的操作吗:")
    return func(*args, **kwargs)
    return confirm


    @add_confirm2
    def func1(arg1):
    print('新增记录:{}'.format(arg1))


    @add_confirm2
    def func2(arg1, arg2):
    print('删除记录:{}、{}'.format(arg1, arg2))


    @add_confirm2
    def func3(arg1, arg2, arg3):
    print('修改记录:{}、{}、{}'.format(arg1, arg2, arg3))


    func1(1009)
    func2(1005, 1006)
    func3(1001, 1002, 1003)
    print()


    # --------------------------------
    # 给一个函数增加多个装饰器
    # --------------------------------
    def confirm_operate(func):
    def confirm(*args, **kwargs):
    print("您确认要执行下面的操作吗?")
    return func(*args, **kwargs)

    return confirm


    def confirm_data(func):
    def confirm(*args, **kwargs):
    print("您确认数据是正确的吗?")
    return func(*args, **kwargs)

    return confirm


    @confirm_operate
    @confirm_data
    def modify(arg1):
    print("修改数据:", arg1)


    modify(1006)
  • 相关阅读:
    Expression多条件筛选
    Express对条件的手动拼接
    查看绝对路径
    检查Linux内核版本信息
    New 路程 2019
    Braintree PayPal 支付网关开发(二)
    Braintree PayPal 支付网关开发(一)
    Quartz 作业调度框架的使用
    C# 扩展方法
    ASP.Net MVC管道分析
  • 原文地址:https://www.cnblogs.com/Teachertao/p/11229220.html
Copyright © 2011-2022 走看看