装饰器就是对函数或者方法或者类进行修饰
如果你要丰富或者说增加一个基本函数的功能,而且我们又不能在原函数上修改,这时候就需要用到装饰器来对基本函数进行修饰了。装饰器本质上也是函数。
以下以“吃饺子的过程”为例子,具体看修饰器函数应该怎样使用
装饰器函数的使用下面列出了10种不同情况的使用,看似复杂,但是主要可以分为4类:
1.被装饰的基本函数不同(带参数,带收集参数,有返回值等)
2.装饰器函数不同(装饰器函数带参数,把装饰器中的具体装饰过程写成类,装饰器本身写成类等)
3.用装饰器函数去装饰一个类
4.装饰器的嵌套
以下是具体情况的示例
# 1. 实现基本的装饰器功能
# 基本函数
def jiaozi():
print('吃饺子美滋滋~')
# 装饰器函数
def zhuangshi(func): #func接收被装饰的函数
def inner():
# 扩展功能1
print('吃饺子前得先煮饺子!')
# 调用基本函数
func()
# 扩展功能2
print('吃完别忘了喝碗饺子汤~')
return inner
# 装饰操作
jiaozi = zhuangshi(jiaozi)
jiaozi()
# 2. 语法糖方式实现装饰器功能
# 装饰器函数
def zhuangshi(func): #func接收被装饰的函数
def inner():
# 扩展功能1
print('吃饺子前得先煮饺子!')
# 调用基本函数
func()
# 扩展功能2
print('吃完别忘了喝碗饺子汤~')
return inner
@zhuangshi
def jiaozi():
print('吃饺子美滋滋~')
jiaozi()
# 3.所要装饰的基本函数带有参数
def zhuangshi(func): #func接收被装饰的函数
def inner(who, where):
# 扩展功能1
print('吃饺子前得先煮饺子!')
# 调用基本函数
func(who, where)
# 扩展功能2
print('吃完别忘了喝碗饺子汤~')
return inner
@zhuangshi
def jiaozi(who, where):
print(who + '在' + where + '吃饺子美滋滋~')
jiaozi('小明','厕所')
# 4.所要装饰的基本函数带返回值
def zhuangshi(func): #func接收被装饰的函数
def inner():
# 扩展功能1
print('吃饺子前得先煮饺子!')
# 调用基本函数
var = func()
# 扩展功能2
print('吃完别忘了喝碗饺子汤~')
return var
return inner
@zhuangshi
def jiaozi():
print('吃饺子美滋滋~')
return '好吃不过饺子~'
jiaozi()
# 5.所要装饰的基本函数带有收集参数
def zhuangshi(func): #func接收被装饰的函数
def inner(*who, **where):
# 扩展功能1
print('吃饺子前得先煮饺子!')
# 调用基本函数
func(*who, **where)
# 扩展功能2
print('吃完别忘了喝碗饺子汤~')
return inner
@zhuangshi
def jiaozi(*who, **where):
print('一块煮饺子的有',who)
print('吃饺子的地点有',where)
jiaozi('小明','小强','小勇','小松',ming = 'WC',qiang = '厕所', yong = '卫生间',song = '洗手间')
# 6.装饰器函数本身带参数
def outer(arg):
# 装饰器函数
def zhuangshi(func): # func接收被装饰的函数
def inner():
# 扩展功能1
if arg == 0:
print('吃饺子前得先煮饺子!')
elif arg == 1:
print('煮饺子前得包饺子')
# 调用原有函数
func()
# 扩展功能2
if arg == 0:
print('吃完别忘了喝碗饺子汤~')
elif arg == 1:
print('吃完饺子还得洗碗~')
return inner
# 返回装饰器函数
return zhuangshi
@outer(0)
def jiaozi():
print('吃饺子美滋滋~')
# 调用函数
jiaozi()
@outer(1)
def jiaozi():
print('吃饺子美滋滋~')
# 调用函数
jiaozi()
# 7.把装饰器函数中的具体操作写成一个类
class Eat:
def before():
print('吃饺子前得先煮饺子!')
def after():
print('吃完别忘了喝碗饺子汤~')
def outer(arg): # arg参数用来接收类(装饰操作写成的那个类)
# 装饰器函数
def zhuangshi(func): # func接收被装饰的函数
def inner():
# 扩展功能1
arg.before()
# 调用原有函数
func()
# 扩展功能2
arg.after()
return inner
# 返回装饰器函数
return zhuangshi
@outer(Eat)
def jiaozi():
print('吃饺子美滋滋~')
jiaozi()
# 8.把装饰器函数写成一个类
class Decor:
#初始化方法
def __init__(self, arg):
self.arg = arg
# 添加call魔术方法
def __call__(self, func):
# 将func参数存入对象使得其他方法可以调用
self.func = func
return self.inner
# 声明内部函数
def inner(self):
print('吃饺子前得先煮饺子!')
self.func()
print('吃完别忘了喝碗饺子汤~')
@Decor(1) #可任意给一个参数
def jiaozi():
print('吃饺子美滋滋~')
jiaozi()
# 9.用装饰器函数 装饰一个类
def zhuangshi(cls):
# 未来Human类的结果
def inner():
#扩展功能1
print('hahahahaah')
var = cls()
# 扩展功能2
print('xuxuxuxuxuxu~~')
return var
return inner
@zhuangshi
class Human:
def man(self):
print('这是一个"用装饰器函数 装饰一个类"的例子')
# 实例化
r = Human()
r.man()
# 10.装饰器的嵌套
def zhuangshi1(func):
# 定义内部函数
def inner():
# 扩展功能1
print('吃饺子前得先煮饺子!')
# 调用函数
func()
# 扩展功能2
print('吃完别忘了喝碗饺子汤~')
return inner
# 装饰器2
def zhuangshi2(func):
# 定义内部函数
def inner():
#扩展功能1
print('煮饺子前得包饺子')
# 调用函数
func()
#扩展功能2
print('吃完饺子还得洗碗~')
return inner
@zhuangshi1
@zhuangshi2 # 装饰器函数运行时从离被装饰的函数最近的装饰器函数开始依次向上执行
def jiaozi():
print('吃饺子美滋滋~')
jiaozi()
Python学习交流、资源共享群:563626388 QQ