【python基础】之装饰器
2021-06-28 02:07
标签:import end color 功能 %s fun 本质 bsp 允许 一、闭包概念 二、装饰器 三、被装饰函数的参数 四、装饰器参数 【python基础】之装饰器 标签:import end color 功能 %s fun 本质 bsp 允许 原文地址:https://www.cnblogs.com/moshang-huakai/p/9650606.html#定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包.
def outer():
x = 10
def inner(): #条件一:inner是内部函数
print(x) #条件二:外部环境的一个变量
return inner
inenr() #报错,找不到引用变量
func = outer()#将inner的引用对象赋值给in_func
func() #相当于执行inner()
#定义:本质依旧是函数,其作用是 在不修改代码的前提下,为已经存在的函数添加额外的功能。
import time
def show_time(f): # 此函数作用相当于:将旧函数带入,返回一个同名新函数
def inner():
start = time.time()
f()
end = time.time()
print(‘spend %s‘ % (end -start))
return inner
@show_time # 等同于 foo =show_time(foo) = inner
def foo():
print(‘hello‘)
time.sleep(2)
foo() #等同于inner()
import time
def show_time(f):
def inner(a,b):
start = time.time()
f(a,b)
end = time.time()
print(‘spend %s‘ % (end -start))
return inner
@show_time
def foo(a,b):
print(a+b)
time.sleep(1)
foo(1,2) #等同于inner(1,2)
import time
def logger(flag):
def show_time(f):
def inner(a,b):
start = time.time()
f(a,b)
end = time.time()
print(‘spend %s‘ % (end -start))
if flag==‘true‘:
print(‘操作日志打印中‘)
return inner
return show_time
@logger(‘true‘)
def foo(a,b):
print(a+b)
time.sleep(1)
@logger(‘‘)
def fuu(a,b):
print(a-b)
time.sleep(1)
foo(1,2) #执行打印操作日志
fuu(1,2) #不执行打印操作日志
‘‘‘
@logger(‘true‘) 做了两件事:
(1)logger(‘true‘):得到闭包函数show_time,里面保存环境变量flag
(2)@show_time :foo=show_time(foo)
上面的logger是允许带参数的装饰器。它实际上是对原有装饰器的一个函数封装,并返回一个装饰器(一个含有参数的闭包函数)。
当我们使用@logger(‘‘)调用的时候,Python能够发现这一层的封装,并把参数传递到装饰器的环境中。
‘‘‘