装饰器

本文深入解析Python装饰器的概念,展示其如何在不修改原有函数代码的情况下添加额外功能,包括日志记录、性能测试等场景应用。同时,文章通过实例演示了单层与双层装饰器的使用,以及装饰器如何处理不定长参数和返回值。

装饰器(decorator)

  • 装饰器本质上是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。

  • 应用场景:插入日志,性能测试,事务处理,缓存,权限校验

  • 作用:为了已经存在的函数或者对象添加额外的功能

    例子1:
    def w1(func):
      def inner():
          #可以加if判断
          print("---验证---")
          func()
      return inner
    
    #f1=w1(f1)
    @w1
    def f1():
      print('f1')
    
    #调用
    f1()

双层装饰器

  • 装饰是从下装到上,调用是从上到下。

    def w1(func):
      print("--正在装饰1--")
      def inner():
          print("--正在验证1--")
          func()
      return inner
    
    def w2(func):
      print("--正在装饰2--")
      def inner():
          print("--正在验证2--")
          func()
      return inner
    
    @w1
    @w2
    def f1():
      print("--f1--")
    #装饰倒着装,调用是从上到下。
    f1()
    
    ###执行结果###
    --正在装饰2--
    --正在装饰1--
    --正在验证1--
    --正在验证2--
    --f1--

装饰器不定长参数

from time import ctime, sleep
def timefun(func):
    #给函数传参数
    def wrappedfunc(*args,**kw):
        print("%s called at %s"%(func.__name__, ctime()))
        func(*args,*kw)
    return wrappedfunc

@timefun
def foo(a,b,c):
    print(a+b+c)

foo(1,2,3)
foo called at Tue Jan  1 17:16:15 2019
6

装饰器return

def func(fun):
    def func_in(*args,**kwargs):
        #ret保存return 返回值,如果没有返回值为None
        ret = fun(*args,**kwargs)
        return ret
    return func_in

@func
def test(args):
    print("---%s--"%(args))
    return "haha"
print(test(1))

装饰器带参数

def func_arg(arg):
    def fun(fun):
        def func():
            print("--记录日志--%s"%(arg))
            if arg=="heihei":
                fun()
            else:
                pass
        return func
    return fun

#1.先执行func_arg函数,return 结果是这个fun函数
#等于使用@fun 对test进行装饰
@func_arg("heihei")
def test():
    print("--test--")

test()

--记录日志--heihei
--test--

类装饰器

class test(object):
    #重写这个call方法,让类加上()就可以被调用。
    def __call__(self):
            print("--test--")
t = test()
t()

--打印结果--
--test--
######

类装饰器

class Test(object):
    def __init__(self,func):
        print("---初始化--")
        print("func name is %s"%(func.__name__))
        self.__func = func

    def __call__(self):
        print("--装饰器中的功能---")
        self.__func()

@Test
def test():
    print("---test--")

test()
--打印结果--
---初始化--
func name is test
--装饰器中的功能---
---test--

转载于:https://www.cnblogs.com/sunjingjingking/p/10203962.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值