def decorator(fn):
def wrapper():
print("询价")
fn()
print("购买成功!") return wrapper def apple():
print("购买苹果") def orange():
print("购买橘子") def potato():
print("购买土豆") ap = decorator(apple)
ap() ora = decorator(orange)
ora() po = decorator(potato)
po()
运行结果
(1) 装饰器相当于使用闭包函数封装公共部分的函数:
在decorator函数中, 定义一个闭包函数 wrapper, 而wrapper函数内部除了输出公共部分print("询价") print("购买成功!")
(2) decorator装饰器传入形参fn作为函数返回
参数fn传入装饰器后, 在闭包函数内部作为函数调用fn()
切记: wrapper作为闭包函数,必须返回
(3) 自定义不同函数 apple, orange, potato ...,作为实参传入装饰器
2 . 赋值给变量
ap = decorator(apple)
1 . 调用
ap()
(4)修改
直接在函数上方使用@decorator就可以调用装饰器,无需再将赋值给变量
调用函数即可
def decorator(fn):
def wrapper():
print("询价")
fn()
print("购买成功!") return wrapper @decorator
def apple():
print("购买苹果") @decorator
def orange():
print("购买橘子") @decorator
def potato():
print("购买土豆") # ap = decorator(apple)
# ap()
#
# ora = decorator(orange)
# ora()
#
# po = decorator(potato)
# po()
apple()
orange()
potato()
(5)添加可变参数
由于调用的函数参数是不固定的,所以传入装饰器的参数必须是可变参数 *args ,其中args是自定义的,可根据实际情况改为具有实际意义的变量
(6)添加关键字参数:**kwargs中的kwargs可自定义
(5)总结
装饰器的作用其实就是封装复用的代码,并且可以将新增的公共代码写在装饰器中,避免了在函数内部扩展代码。秉承了函数的封闭性和开放性,即对修改是封闭的,对扩展是开放的 , 需要在装饰器传入可变参数和关键字参数,调用的函数才能传参。