装饰器原理
闭包及性质
- 函数的嵌套
- 内嵌函数可访问外层函数的变量
装饰器实现
- 函数作为参数传递到装饰函数中
- 利用闭包特性,对需装饰的函数进行装饰
- 返回装饰结束的函数
- “ @ ”为装饰器的语法糖
普通装饰器
适用于给已有的代码添加一点新功能
有一个回家函数 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() >>>买朵玫瑰 >>>买个苹果 >>>回家送给对象!