• 装饰器--decorator2


    装饰器加参数


    import time
    
    def timer(func):  # timer(test2) func = test2
    	def deco():
    		start_time = time.time()
    		func()   # run test1()
    		stop_time = time.time()
    		print("the action time of the program is {}".format(stop_time-start_time))
    	return deco   # 返回了deco的内存地址
    
    @timer         # test2 = timer(test2)=deco
    def test2(name):
    	time.sleep(2)
    	print("the name is {}".format(name))
    
    test2("bigberg") # test2("bigberg") = deco("bigberg")
    
    #输出
    Traceback (most recent call last):
      File "G:/python/untitled/study3/decoration4.py", line 17, in <module>
        test2("bigberg")
    TypeError: deco() takes 0 positional arguments but 1 was given
    
    1. 我们重新定义一个test2函数,并传入一个参数name,而函数运行报错 deco()没有传入参数。
    2. @timer 其实相当于 test2 = timer(test2) = deco
    3. test2("bigberg") = deco("bigberg") 

    所以我们需要在嵌套函数 deco()中传入一个参数,才能确保程序正确

    import time
    
    def timer(func):  
    	def deco(arg1):
    		start_time = time.time()
    		func(arg1)   
    		stop_time = time.time()
    		print("the action time of the program is {}".format(stop_time-start_time))
    	return deco   # 返回了deco的内存地址
    
    @timer
    def test2(name):
    	time.sleep(2)
    	print("the name is {}".format(name))
    
    test2("bigberg")
    
    #输出
    the name is bigberg
    the action time of the program is 2.0001132488250732
    

      到这里传参已经实现了,但是如果参数个数不固定呢?我们还有非固定参数:

    import time
    
    def timer(func):  # timer(test1) func = test1
    	def deco(*args,**kwargs):
    		start_time = time.time()
    		func(*args,**kwargs)   # run test1()
    		stop_time = time.time()
    		print("the action time of the program is {}".format(stop_time-start_time))
    	return deco   # 返回了deco的内存地址
    
    @timer
    def test1():
    	time.sleep(2)
    	print("in the test1.")
    
    @timer
    def test2(name,age):
    	time.sleep(2)
    	print("the name is {} and age is {}".format(name,age))
    
    test1()
    test2("bigberg",18)
    
    #输出
    in the test1.
    the action time of the program is 2.0002853870391846
    the name is bigberg and age is 18
    the action time of the program is 2.000582218170166
    

      由此可见使用非固定参数后,被修饰函数有没有参数都可以正常运行了。

  • 相关阅读:
    周末单车行
    大笨
    随谈个人所得税起征点
    我的新球拍
    谈“家乐福抵制门”事件
    49届世乒赛(团体)电视转播时间表
    上海动物园拍摄记
    一个老外的故事
    请大家帮忙推荐一款名片管理软件
    不要先挂电话
  • 原文地址:https://www.cnblogs.com/bigberg/p/6636441.html
Copyright © 2020-2023  润新知