为什么需要修饰器&什么是修饰器
- 为什么需要修饰器?
比如某个函数需要扩展某个新的功能,我们会去新建一个函数,然后由函数去调用新建的函数。这样是可以的,但不符合开发的封闭原则(对于扩展是开放的,但是对于修改是封闭的),有没有更好的方式去解决呢。当然有的,就是修饰器。
- 什么是修饰器
举个例子,虽有点污,但跟装饰器这个话题很贴切。每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它变得更厚更长,这样一来,它不仅有遮羞功能,还能提供保暖,不过有个问题,这个内裤被我们改造成了长裤后,虽然还有遮羞功能,但本质上它不再是一条真正的内裤了。于是聪明的人们发明长裤,在不影响内裤的前提下,直接把长裤套在了内裤外面,这样内裤还是内裤,有了长裤后宝宝再也不冷了。装饰器就像我们这里说的长裤,在不影响内裤作用的前提下,给我们的身子提供了保暖的功效。
简单的修饰器
def add_code(func):
def code():
print("需要添加的代码")
return func()
return code
@add_code
def say_hello():
print("hello")
if __name__ == '__main__':
say_hello()
@语法糖 如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖,它放在函数开始定义的地方,这样就可以省略最后一步再次赋值的操作。
带参数的修饰器
def add_code(func):
def code(name):
print("需要添加的代码")
name = "<tr>" + name + "</tr>"
return func(name)
return code
@add_code
def say_hello(name):
print("hello," + name)
if __name__ == '__main__':
say_hello("world")
带返回值的修饰器
def add_code(func):
def code(name):
print("需要添加的代码")
name = "<tr>" + name + "</tr>"
return func(name)
return code
@add_code
def say_hello(name):
return "hello" + name
if __name__ == '__main__':
print(say_hello("world"))
不定参数修饰器
def add_code(func):
def code(*args, **kwargs):
if args:
for arr in args:
print(arr)
if kwargs:
for key, value in kwargs.items():
print('{key}:{value}'.format(key=key, value=value))
return func(*args, **kwargs)
return code
@add_code
def say_hello(*args, **kwargs):
return "ok"
if __name__ == '__main__':
say_hello("李四")
say_hello(100, 200, 300)
say_hello(name="张三", sex="男", age="18")
END
还有多个函数调用同一个修饰器和一个函数调用多个修饰器及修饰器的原理,后面有机会再写吧。by
Comments | NOTHING