用python写一个适合自己的装饰器库
经过对python装饰器的初步了解以后,我们就可以自己动手写一个属于自己的装饰器库,以方便我们在日常的码文生活中直接调用,给我们的代码加一层“神秘”@魔法糖。如果有读者对装饰器不熟的,可以阅读本人的一篇博客《初识python之装饰器》。下面,我们直入正题。
目录
一、盘点一些常见的装饰器
提示信息装饰器
该装饰器在上一篇博客中提到过,可以输入自定义提示信息,为函数增加一个输出提示信息的功能。
代码:
def print_tips(tips=""):
def _print_tips(func):
def warpper(*args, **kwargs):
print(tips)
return func(*args, **kwargs)
return warpper
return _print_tips
@ print_tips("我是一个没有感情的菠萝头...")
def func1(*args, **kwargs):
print("此处省略对参数{}和参数{}的所有操作".format(args, kwargs))
示例:
func1("大地母亲", father="老天爷")
结果:
我是一个没有感情的菠萝头...
此处省略对参数('大地母亲',)和参数{'father': '老天爷'}的所有操作
检测函数进度装饰器
该装饰器实际上并没有那么高大上,只是反映函数的运行状况,如果正常运行,皆大欢喜;若运行错误,则爆出错误类型,并打印提示信息,是否继续运行。如果有同学想用到界面设计类型的程序中,要注意修改一下,不要轻易让函数暂停。
代码:
def print_func_process_(func):
def warpper(*args, **kwargs):
print(func.__name__ + " Start...")
try:
ret = func(*args, **kwargs)
print("Done")
return ret
except Exception as e:
print("Error, 错误类型为: ", e)
print("程序停在了这里,按回车继续运行...(运行有风险,回车需谨慎)")
os.system("pause")
return warpper
@ print_func_process_
def func2(*args, **kwargs):
print("此处省略对参数{}和参数{}的所有操作".format(args, kwargs))
raise IndexError("我是自己创造自己,你说气人不气人?")
示例:
由于我们的示例函数是自身报错,如果正常运行,则不会报错。
func2("数字1", num="数字2")
结果:
func2Start...
此处省略对参数('数字1',)和参数{'num': '数字2'}的所有操作
Error, 错误类型为: 我是自己创造自己,你说气人不气人?
程序停在了这里,按回车继续运行...(运行有风险,回车需谨慎)
计算时间装饰器
这个装饰器算是比较常见的了,但是用的也多,我们有时候经常会对程序的运行时间进行统计,以方便我们修改算法,提高运行效率,这时候有一个可以计算运行时间的装饰器能大大提高我们的开发效率。
代码:
def cal_time(func):
def warpper(*args, **kwargs):
s = time.time()
ret = func(*args, **kwargs)
print("The Function expended time is %f s" % round(time.time() - s, 4))
return ret
return warpper
@ cal_time
def func3(*args, **kwargs):
time.sleep(1.234)
示例:
func3()
结果:
The Function expended time is 1.234700 s
函数多线程运行装饰器
这一个装饰器是本人在进行界面编程的时候,经常遇到程序处理时间过长导致界面反应不过来,要不就是程序堵塞在处理函数的地方,让界面卡顿甚至死机。解决这种情况,往往要用到多线程的方法,所以写了一个装饰器,方边食用。
代码:
此处的MyThread类,是自己重新构造的一个Thread类,可以返回程序运行结果,如果不了解的,可以去看一看本人的上一篇博客《python之threading多线程的简单使用》。
def thread_dec(func):
def warpper(*args, **kwargs):
thread = MyThread(func, *args, **kwargs)
thread.start()
thread_ret = thread.get_result()
return thread_ret
return warpper
@ thread_dec
def func4(*args, **kwargs):
print("第{}个func4开始执行".format(args[0]))
time.sleep(2)
示例:
@ cal_time
def thread_test():
for i in range(5):
func4(i)
thread_test()
结果:
第0个func4开始执行
第1个func4开始执行
第2个func4开始执行
第3个func4开始执行
第4个func4开始执行The Function expended time is 0.001000 s
二、总结
除了上面写的那几个比较简单的装饰器以外,常用的其实还有日志记录装饰器、发送邮件装饰器等等,有了上面的模板,读者可以自己尝试写一下,由于个人不常用的类似的装饰器,因此没有动手写过,有需要的可以试试。