装饰器是什么?
顾名思义,装饰器就是用来装饰的。例如我们现在想往房子里放些花作为装饰,那会怎么去做呢,获得花,然后将花放在桌上、床上亦或是你想的任何地方。
首先让我们先写个花的装饰器吧,
def flowers(func): #装饰函数
def inner(p): #内部函数,包含内部函数与需要装饰函数的操作
print("花"+func(p))
return inner #返回内层的函数给装饰函数。在一些代码编辑器中使用自动补齐时可能会带上括号,记得删掉哦。函数带括号与不带括号的区别这里不做说明。
有了花之后呢,我们就可以用花的装饰器进行装饰啦,
@flowers #调用flower装饰器
def put_flower(p):
t = "放到" + str(p) +"上"
return t
put_flower("桌子")
put_flower("椅子")
运行结果:
从这个过程中可以看出,被装饰函数会作为装饰函数的一部分进行执行。
为什么要用装饰器
还是以花的装饰为例。在现实生活中想要在大house(希望大家都会有)里用花装饰些地方,步骤一般都是会先获得花,然后把它们放在你想要装饰的地方,例如桌子,然后我们就能得到一个装饰着花的桌子。那我们可不可以直接定制一个上面本来就装饰着花的桌子呢?当然可以,不过这样成本就会变高,花花也会与桌子成为一个整体,用胶沾着,用绳子绑着,难以将它与桌子分割,随心所欲地放到其它地方。
在程序中也是如此。我们可以将经常被重复使用的操作写成装饰器,这样只需添加个@装饰器名就能直接使用了,例如鉴权,而无需重复编写,节约了代码量,提高了开发效率。
概念补充
其他语言中相似的应用方式,例如JAVA中的AOP(面向截面编程),设计模式中也有装饰器模式这样的概念,而这些其实都是基于开闭原则的扩展。
开闭原则:英文名Open-Close Principle(OCP),一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。目的就是保证程序的高扩展性,易于维护和升级。
开闭原则被称之为面向对象设计的基石,其他的原则都可以看作为实现开闭原则的方式和手段。其概念通俗来说就是,开发一个软件时,应该具备扩展性,而在进行这些扩展时,不需要对原来的程序进行修改。这样软件的可用性就会非常灵活,扩展性强,不用担心稳定性等问题。我们在设计编写软件,这也是需要去注意的一方面。