Python学习之路--装饰器
Posted L.Sir
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习之路--装饰器相关的知识,希望对你有一定的参考价值。
闭包
通俗来讲,闭包就是在函数中定义一个内部的函数,并且这内部函数调用了外部函数中定义的变量,例如:
def outter():
x = 10
def inner():
print(x)
return inner()
outter()
错误陷阱:
def my_func(*args):
fs = []
for i in args:
def func():
return i * i
fs.append(func)
return fs
fs1, fs2, fs3 = my_func(1,2,3)
print(fs1())
print(fs2())
print(fs3())
什么是装饰器
装饰器一般用于增强一个已经存在的函数或类的功能的函数。
示例
展示程序运行时间为例:
- 不是用装饰器写法
def foo():
start_time = time.time()
print('2222')
time.sleep(2)
end_time = time.time()
print('use %s'%(end_time - start_time))
def bar():
start_time = time.time()
print('333')
time.sleep(3)
end_time = time.time()
print('use %s'%(end_time - start_time))
- 使用装饰器
import time
def show_time(f):
def inner():
start_time = time.time()
f()
end_time = time.time()
print('use %s'%(end_time - start_time))
return inner
@show_time
def foo():
print('333')
time.sleep(3)
@show_time
def bar():
print('2222')
time.sleep(2)
foo()
bar()
被装饰器装饰函数参数传递
- 以加法器为例
import time
def show_time(f):
def inner(*args):
start_time = time.time()
f(*args)
end_time = time.time()
print('use %s'%(end_time - start_time))
return inner
@show_time
def add(*args):
Sum=0
for i in args:
Sum+=i
print(Sum)
time.sleep(3)
add(1,2)
装饰器参数传递
- 选择被装饰的函数是否进行日志记录
import time
def Is_log(Flag):
def show_time(f):
def inner(*args):
start_time = time.time()
f(*args)
end_time = time.time()
if Flag = True:
print('日志')
print('use %s'%(end_time - start_time))
return inner
return show_time
@Is_log(True)
def add(*args):
Sum=0
for i in args:
Sum+=i
print(Sum)
time.sleep(3)
add(1,2)
以上是关于Python学习之路--装饰器的主要内容,如果未能解决你的问题,请参考以下文章