装饰器五部曲
承蒙大家厚爱,我的《Go语言之路》的纸质版图书已经上架京东,有需要的朋友请点击 此链接 购买。
听说你学不会装饰器?跟着本文一步一步来彻底掌握Python中的装饰器吧!
Python基础之装饰器五部曲,带你轻轻松松学会装饰器。
装饰器(decorator)是Python中的高级语法。装饰的意思就是动态扩展被装饰对象的功能。装饰器可以用于装饰函数、方法和类。
一 嵌套函数
# 定义一个外层函数
def foo():
# 定义了一个内部函数
def bar():
print("hello world")
函数bar
是一个定义在foo
函数内部的函数。
Python中的函数是支持嵌套的,也就是可以在一个函数内部再定义一个函数。
然后,我们还知道函数是可以当作变量的,于是我们就可以在foo
函数中把定义的这个bar
函数返回。就像下面这样:
# 定义一个外层函数
def foo():
# 定义了一个内层函数
def bar():
print("hello world")
return bar
func = foo()
func() # func --> bar,这里执行func其实就相当于执行了在foo函数内部定义的bar函数
二 闭包形态1
# 闭包形态1
def foo():
name = "Andy" # 外部函数的局部变量
# 定义了一个内部函数
def bar():
print(name) # 虽然bar函数中没有定义name变量,但是它可以访问外部函数的局部变量name
return bar
func = foo()
func() # func --> bar --> 除了是一个函数,还包含一个值(它外层函数的局部变量)的引用
三 闭包形态2
# 闭包形态2
def foo(name): # 给一个函数传参也相当于给函数定义了一个局部变量
# 定义了一个内部函数
def bar():
print(name) # 内部函数同样可以获取到传到外部函数的变量(参数)
return bar
func = foo("Andy") # 把“Andy”当成参数传入foo函数 --> 其内部定义的bar函数也能拿到这个“Andy”
func() # func --> bar --> 除了是一个函数,还包含一个值(它外层函数的参数)的引用
四 装饰器形态1
# 还是定义一个外层函数
def foo(name): # 我接收的参数是一个函数名
# 定义了一个内部函数
def bar():
print("这是新功能。。。") # 新功能
name() # 函数名加()就相当于执行--> 我传进来原函数的函数名,这里就相当于执行了原函数
return bar
# 定义一个被装饰的函数
def f1():
print("hello world.")
# 用foo函数装饰f1函数
f1 = foo(f1)
# 不改变f1的调用方式
f1() # --> 此时函数已经扩展了新功能
五 装饰器形态2
# 还是定义一个外层函数
def foo(name): # 接收的参数是一个函数名
# 定义了一个内部函数
def bar():
print("这是新功能。。。") # 新功能
name() # 函数名加()就相当于执行--> 传进来原函数的函数名,这里就相当于执行了原函数
return bar
# 定义一个被装饰的函数
# 用foo函数装饰f1函数
@foo # 使用f1 = foo(f1)语法装饰的话稍显啰嗦,Python就提供了@语法,让装饰过程更简便
def f1():
print("hello world.")
# 不改变f1的调用方式
f1() # --> 此时函数已经扩展了新功能