python 装饰器
装饰器的理解
装饰器:本质就是函数,用于装饰其他函数, 附加所装饰函数所没有的功能。
首先先理解下闭包:
# 闭包
def say_name(name):
def hello():
print(name)
return hello # 返回hello函数的内存地址
#闭包调用
sn = say_name('王')
sn()
装饰器解决的需求:现在有下面一个函数,想算一下函数运行的时间,但是不能改变原来的函数的原来代码和调用方式,应该怎么解决呢
import time
def eat():
print('吃。。。')
time.sleep(3)
eat()
原生装饰器:
import time
#装饰器函数
def count_time(func):
def wrapper():
start_time = time.time()
func()
end_time = time.time()
print('共花费时间:', end_time - start_time)
return wrapper
def eat():
print('吃。。。')
time.sleep(3)
eat = count_time(eat)
eat()
不带参数的被装饰的函数
import time
def count_time(func):
def wrapper():
start_time = time.time()
func()
end_time = time.time()
print('共花费时间:', end_time - start_time)
return wrapper
@count_time # 相当于eat = count_time(eat)
def eat():
print('吃。。。')
time.sleep(3)
eat()
带参数的被装饰的函数
def count_time(func):
def wrapper(food):
start_time = time.time()
func(food)
end_time = time.time()
print('共花费时间:', end_time - start_time)
return wrapper
@count_time#相当于eat = count_time(eat)
def eat(food):
print('吃%s....' % food)
time.sleep(3)
eat('苹果')
带参数的装饰器
import time
def write_log(flog=0):
def count_time(func):
def wrapper(food):
start_time = time.time()
func(food)
end_time = time.time()
print('共花费时间:', end_time - start_time)
if flog == 1:
print('该数据写入了日志')
return wrapper
return count_time
@write_log(1) #相当于eat=write_log(1)(eat)
def eat(food):
print('吃%s....' % food)
time.sleep(3)
eat('苹果')