• 装饰器


    装饰器(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--
    
    
  • 相关阅读:
    Webform服务器控件调用JS
    Webfrom基础知识
    Webform用户控件
    数组练习
    整理
    SVN分支与合并
    根据经纬度,获取两点间的距离
    简单Bat文件编写
    Maven Android使用一
    Maven环境配置
  • 原文地址:https://www.cnblogs.com/sunjingjingking/p/10203962.html
Copyright © 2020-2023  润新知