这块涉及到了闭包、LEGB作用域的问题,我能写能用,但实在表达力不够好,就分享下我自己的学习经历和初步学成后手写的自定义装饰器吧。
初次学习:
初步学成后,写的自定义装饰器:
# coding=utf-8
# encoding: utf-8
"""
Author:刘源
Createtime:2021/07/31 22:43:36
Updatetime:2021/07/31 22:43:36
Description:
"""
import time, threading, os, pathlib, multiprocessing, sys, codecs, re, functools, sys
file1 = open('LinuxPython5W2H-11.txt', 'a')
file1.write(f'{__file__}运行记录')
file1.write(time.ctime())
file1.write('---' + str(time.time()) + '\n')
file1.close()
# 手写闭包装饰器(ps:变量作用4大范围-LEGB规则-Local,Enclosing,Global,Built_in)
def timer(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f'函数耗时{end - start}s')
return result
return wrapper
@timer
def sleep3(x):
time.sleep(3)
return x ** 3
print('1------', sleep3(4))
# 手写高级闭包装饰器-闭包嵌套更多的函数
def timer_author(author):
def timer(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f'高级闭包装饰器记录的耗时是{end - start}s,且设置者是{author}')
return result
return wrapper
return timer
@timer_author('刘源')
def sleep2():
time.sleep(2)
return '2秒'
@timer_author('李昊')
def sleep4():
time.sleep(4)
return '4秒'
print('2------', sleep2())
print('3------', sleep4())
效果:
3个特殊装饰器: