装饰器原理
闭包及性质
- 函数的嵌套
- 内嵌函数可访问外层函数的变量
装饰器实现
- 函数作为参数传递到装饰函数中
- 利用闭包特性,对需装饰的函数进行装饰
- 返回装饰结束的函数
- “ @ ”为装饰器的语法糖
普通装饰器
适用于给已有的代码添加一点新功能
有一个回家函数 go_home
def go_home(): print("回家了!!!") go_home() >>>回家了!!!
在回家之前去搞个苹果
def get_apple(func): def f(): print("买了个苹果!") func() return f @get_apple def go_home(): print("回家了!!!") go_home() >>>买了个苹果! >>>回家了!!!
装饰带返回值的函数
有一个回家函数 go_home
def go_home(): return "回家了!!!" ret = go_home() print(ret) >>>回家了!!!
在回家之前去搞个苹果
def get_apple(func): def f(): print("买了个苹果!") ret = func() return ret return f @get_apple def go_home(): return "回家了!!!" ret = go_home() print(ret) >>>买了个苹果! >>>回家了!!!
装饰带参数的函数
有一个回家函数 go_home
def go_home(mood): print(mood+"的回家了!!!") go_home(“高高兴兴”) >>>高高兴兴的回家了!!!
在回家之前去搞个苹果
def get_apple(func): def f(*args, **kwargs): print("买了个苹果!") func(*args, **kwargs) return f @get_apple def go_home(mood): print(mood+"的回家了!!!") go_home(“高高兴兴”) >>>买了个苹果! >>>高高兴兴的回家了!!!
带参数的装饰器
- 面对不同的函数装饰效果需要不同,就可以给装器加上参数
def get_apple(apple="苹果"):
def f1(func):
def f2():
print("买了个"+apple)
func()
return f2
return f1
@get_apple("红红的苹果")
def go_home():
print("回家了!!!")
@get_apple("烂苹果")
def gift():
print("送给坏人!!!")
go_home()
gift()
>>>买了个红红的苹果
>>>回家了!!!
>>>买了个烂苹果
>>>送给坏人!!!
多个装饰器装饰同一个函数
- 对函数加装多个功能
def flower(func):
def f():
print("买朵玫瑰")
func()
return f
def get_apple(func):
def f():
print("买个苹果")
func()
return f
@flower
@get_apple
def go_home():
print("回家送给对象!")
go_home()
>>>买朵玫瑰
>>>买个苹果
>>>回家送给对象!