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 : ‘, args) #查看传入的参数
print(‘calling time : ‘, 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 = ‘, a)
@showTime
def function2():
print(‘running function2 ‘)
function1(3)
function2()
返回:
args is : (3,) calling time : 1567078015.031965 running function1 a = 6 args is : () calling time : 1567078015.0320058 running function2
2.如果是双重修饰符
1)简单版本,编译即实现
import time
def sayHello(fn):
print(‘Hello‘)
def showTime(fn):
print(‘calling time : ‘, time.time())
fn(3)
@sayHello
@showTime
def function1(a):
print(‘running function1 ‘)
print(‘a = ‘, a)
这个编译就会返回:
calling time : 1567078623.5239282 running function1 a = 3 Hello
2)调用才实现
如果想要以sayHello -> showTime -> function1的顺序,写法就要变为:
#coding:utf-8 import time def sayHello(fn):
def hello(*args):
print(‘Hello‘)
fn(*args) # 2
return hello # 1
def showTime(fn):
def getTime(*args):#4 *args获得fn的参数
print(‘args is : ‘, args) #查看传入的参数
print(‘calling time : ‘, time.time())
if len(args) > 0:
n = args[0]
n *= 2
fn(n) #5 要在修饰符函数中调用传入的函数参数fn,否则function1/function2是不会被调用的,仅仅只输出了时间信息
else:
fn()
return getTime # 3
@sayHello
@showTime
def function1(a): # 5
print(‘running function1 ‘)
print(‘a = ‘, a)
function1(3)
等于sayHello(showTime(function1(a))),所以调用function1(3)时运行的顺序为 :
先调用sayHello()返回的hello(3),此时传入的参数*args为(3,),然后调用hello中的fn(*args) 其实就是调用showTime()返回的getTime(3),此时传入的参数*args为(3,),然后调用getTime中的fn(n=6) 其实就是调用function1(6),就结束了返回:
Hello args is : (3,) calling time : 1567078847.98264 running function1 a = 6
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did172310