装饰器模式介绍
装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
装饰器模式实现
设计模式只是一种思想与语言无关,设计模式可以通过多种语言方式去实现它。
今天我们来使用python中函数的闭包形式来类似实现装饰器模式。
下面我们在不改变原函数定的情况下,给原函数添加新的功能。我们在不改动原函数的情况下,给原函数添加日志功能。
装饰器模式python代码展示
import time
def log(func_arg):
"""日志装饰器 给调用的函数进行日志打印"""
def func_time():
print("log %s begin time:%s" % (func_arg.__name__,time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time() ) ) ) )
func_arg()
print("log %s end time:%s" % (func_arg.__name__ ,time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))))
return func_time
@log
def func1():
print("func1业务逻辑开始")
# func1 函数的业务逻辑
for i in range(100000000):
pass
print("func1业务逻辑结束")
@log
def func2():
print("func2业务逻辑开始")
# func2 函数的业务逻辑
for i in range(100000000):
pass
print("func2业务逻辑结束")
# func1 = log(func1)# 使用python中语法糖进行代替 效果一样
# func2 = log(func2)# 使用python中语法糖进行代替 效果一样
func1()
func2()
装饰器模式python代码说明
采用函数式编程的思想,将需要拓展功能的原函数,将其作为参数 传送到我们的装饰器中,返回一个新的函数替换原函数 ,新函数执行会执行原函数,这样我们就可在执行原函数的前后添加我们自定义的功能了,而不需要改动原函数了。这种利用闭包的实现方式都可以在支持函数式编程的语言中去实现比如JavaScript就可以用差不多的语法进行实现,c语言中可以用指针实现类似的装饰器模式。
还有就是 采用了语法糖可以代替装饰器函数将原函数包起来。