zoukankan      html  css  js  c++  java
  • 在函数被装饰的情况下如何取消装饰器,访问原始函数

    在函数被装饰器装饰的情况下,需要保持原始函数的文档,帮助信息等信息,或者直接调用原始函数,此时需要引入wraps模块

    #!/usr/bin/env python
    #coding:utf-8
    #@Author:Andy
    # Date: 2017/6/14
    
    
    import time
    from random import randrange
    
    # 装饰器
    def timer(func):
    	"""
    	Measure function's running time
    	"""
    	def wrapper(*args, **kwargs):
    		start_time = time.time()
    		func(*args, **kwargs)
    		stop_time = time.time()
    		print("Run time is %s" % (stop_time - start_time))
    	return wrapper
    
    @timer
    # 被装饰函数
    def index(n:int):
    	time.sleep(randrange(1, 5))
    	print("I was decorated!")
    
    
    if __name__ == '__main__':
    	index(5)
    	print("function name:",index.__name__)
    	print("doc:",index.__doc__)
    	print("annotations:", index.__annotations__)
    	print("
    Origin index function:
    ")
    	origin_index = index.__wrapped__
    #AttributeError: 'function' object has no attribute '__wrapped__'
    	#origin_index(10)
    

     上面因为没有引入wraps ,会出现attribueError错误,引入wraps后:

    import time
    from random import randrange
    from functools import wraps
    
    # 装饰器
    def timer(func):
    	"""
    	Measure function's running time
    	"""
    	@wraps(func)
    	def wrapper(*args, **kwargs):
    		start_time = time.time()
    		func(*args, **kwargs)
    		stop_time = time.time()
    		print("Run time is %s" % (stop_time - start_time))
    	return wrapper
    
    @timer
    # 被装饰函数
    def index(n:int):
    	"""
    	Decorated function
    	"""
    	time.sleep(randrange(1, 3))
    	print("I was decorated!")
    
    
    if __name__ == '__main__':
    	index(5)
    	print("function name:",index.__name__)
    	print("doc:",index.__doc__)
    	print("annotations:", index.__annotations__)
    	print("
    Origin index function:
    ")
    	origin_index = index.__wrapped__
    	origin_index(10)
    

     结果:

    I was decorated!
    Run time is 2.0009963512420654
    function name: index
    doc: 
    	Decorated function
    	
    annotations: {'n': <class 'int'>}
    
    Origin index function:
    
    I was decorated!
    
  • 相关阅读:
    【转】SVN linux命令及 windows相关操作(二)
    【转】SVN linux命令及 windows相关操作(一)
    spring框架DI(IOC)和AOP 原理及方案
    [转载]JVM性能调优--JVM参数配置
    JVM性能调优-GC内存模型及垃圾收集算法
    密码运算API(GP Internal API)
    时间API(GP Internal API)
    可信存储API(GP Internal API)
    内存管理函数(GP Internal API)
    Panic(GP Internal API)
  • 原文地址:https://www.cnblogs.com/Andy963/p/7015824.html
Copyright © 2011-2022 走看看