装饰器
写在前面的话:
想要搞懂装饰器,多翻阅大神的博客,自己动手将代码实例化。
下面的代码都是随便取的名字,为了方便阅读,所以后面用了很多大白话。
感谢各位先行者提供的经验之谈,如果侵权请告知,再次致谢。
这句话很重要:python一切皆对象!
一、装饰器前言
装饰器(Decorator)是一个装饰函数的函数,本质就是一个函数,用来在不修改被装饰函数的源代码与调用方式的前提下,对被装饰函数进行功能扩展的函数。掌握装饰器前需要学习以下4点知识:
- 函数的本质就是一个指向函数本体的内存地址,执行函数的方法为函数名();
- 闭包(closure)知识;
- 开放封闭原则(OCP,Open Closed Principle):对扩展是开放的,而对修改是封闭的;
- 函数的元组参数(*args)与字典参数(**kwargs)
二、装饰器初识
"""定义一个装饰器"""
def outer(func):
def inner():
print("这是中华人民共和国:", end="")
func()
return inner
@outer # >>> demo1 = outer(demo1)
def demo1(): #要被装饰的函数
print("湖南省")
demo1()
👆👆👆👆代码中,outer与inner组成的闭包函数构成了一个装饰器,对demo1函数进行装饰。这样就可以在不修改demo1的前提下,添加新的功能——打印“这是中华人民共和国:”这样一句话。
通过语法糖:@,如下:
@outer # @outer ==> demo1 = outer(demo1)
def demo1():
不难看出,outer函数实际上被当做对象赋值给了demo1这个变量,此时的demo1等于是调用了outer(),由于outer函数的返回值是inner,间接调用了inner函数,而在inner函数内部存在下面一句代码,
func()
"""
func是外部函数的参数,@将demo1作为实参返回给了outer函数的形参func
func() ==> demo1() 此时完成了对demo1的调用,实现了装饰demo1的功能
"""
demo1的代码功能实际上被内部函数所接收了,意味着装饰器成功的对demo1进行了修饰,完成了新功能的添加。
下面通过两幅图来进行说明: