python中的修饰符@的作用
1.一层修饰符 1)简单版,编译即实现 在一个函数上面添加修饰符 @另一个函数名 的作用是将这个修饰符下面的函数作为该修饰符函数的参数传入,作用可以有比如你想要在函数前面添加记录时间的代码,这样每个函数调用时就能够知道是什么时候调用的,但是你不想手动地去给每个函数添加,那么就能够使用该修饰符实现这样的功能,下面举例说明: #coding=UTF-8 import time def showTime(fn): print(‘calling time : ‘,time.time()) fn() #调用传入的参数 @showTime def function1(): print(‘running function1 ‘) @showTime def function2(): print(‘running function2 ‘) 返回: calling time : 1567076890.053299 running function1 calling time : 1567076890.0533462 running function2 ? 但是发现showTime()函数这样子写,即使将fn()行调用代码删除,也会在编译时就输出时间信息: import time def showTime(fn): print(‘calling time : ‘,time.time()) @showTime def function1(): print(‘running function1 ‘) @showTime def function2(): print(‘running function2 ‘) 返回: calling time : 1567077493.420067 calling time : 1567077493.420131 而且这个时候如果调用function1()会报错: TypeError: ‘NoneType‘ object is not callable ? 2)调用才实现 如果去希望是在显示调用function1()和function2()函数时才显示时间,正确的写法是: import time def showTime(fn): def getTime(): print(‘calling time : ‘,time.time()) fn() #要在修饰符函数中调用传入的函数参数fn,否则function1/function2是不会被调用的,仅仅只输出了时间信息 return getTime @showTime def function1(): print(‘running function1 ‘) @showTime def function2(): print(‘running function2 ‘) function1() function2() 返回: calling time : 1567077669.2308512 running function1 calling time : 1567077669.230927 running function2 ? 3)传入参数 如果函数中需要传入参数: def showTime(fn): def getTime(*args):#*args获得fn的参数 print(‘args is : ‘,args) #查看传入的参数 print(‘calling time : ‘,time.time()) if len(args) > 0: fn(args[0]) #要在修饰符函数中调用传入的函数参数fn,否则function1/function2是不会被调用的,仅仅只输出了时间信息 else: fn() return getTime @showTime def function1(a): print(‘running function1 ‘) print(‘a = ‘,a) @showTime def function2(): print(‘running function2 ‘) function1(3) function2() 返回: args is : (3,) calling time : 1567077936.79216 running function1 a = 3 args is : () calling time : 1567077936.792191 running function2 ? 如果想要对传入的参数进行操作: import time def showTime(fn): def getTime(*args):#*args获得fn的参数 print(‘args is : ‘,time.time()) if len(args) > 0: n = args[0] n *= 2 fn(n) #要在修饰符函数中调用传入的函数参数fn,否则function1/function2是不会被调用的,仅仅只输出了时间信息 else: fn() return getTime @showTime def function1(a): print(‘running function1 ‘) print(‘a = ‘,) calling time : 1567078015.031965 running function1 a = 6 args is : () calling time : 1567078015.0320058 running function2 ? 2.如果是双重修饰符 1)简单版本,编译即实现 import time 这个编译就会返回: calling time : 1567078623.5239282 running function1 a = 3 Hello ? 2)调用才实现 如果想要以sayHello -> showTime -> function1的顺序,写法就要变为: ? #coding:utf-8 ? 等于sayHello(showTime(function1(a))),所以调用function1(3)时运行的顺序为 :
返回: Hello args is : (3,) calling time : 1567078847.98264 running function1 a = 6 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |