定义:装饰器用于拓展原来函数功能的一种语法,返回新函数替换旧函数
优点:在不更改原函数的前提下,给函数拓展新的功能
语法:@
#1.装饰器的原型
def kuozhan(func):
def newfunc():
print('蓬头垢面')
func()
print('容光焕发')
return newfunc
@kuozhan
def func():
print('我是一名学生')
func()
# func=kuozhan(func)
# func()
#2.装饰器的嵌套
def kuozhan1(func):
def newfunc():
print('蓬头垢面1')
func()
print('酒足饭饱2')
return newfunc
def kuozhan2(func):
def newfunc():
print('洗洗手3')
func()
print('簌簌口4')
return newfunc
@kuozhan2
@kuozhan1
def func():
print("我是一个学生")
func()
#输出结果:3124
#4.用装饰器装饰带有参数返回值的函数
def kuozhan(func):
def newfunc(*args,**kwargs):
print('萎靡不正')
func(*args,**kwargs)
print('精神抖擞')
return newfunc
@kuozhan
def func(*args,**kwargs):
dic={'wky':'小吴','wf':'小王'}
strvar=""
for i in args:
strvar +=i + " "
print('运动地点:'+strvar)
lst=[]
for k,v in kwargs:
if k in dic:
res=dic[k] + '留下了' + v + '黄金'
lst.append(res)
return lst
res=func('操场','草坪',wky='15克',wf='15千克')
print(res)
##5.用类装饰器装饰原函数
class kuozhan():
#原函数被func这个形参接收到了
def __call__(self,func):
#调用一下kuozhan2函数,返回newfunc新函数
return self.kuozhan2(func)
def kuozhan1(func):
def newfunc():
print('干净整洁')
func()
print('臭气雪天')
return newfunc
def kuozhan2(func):
def newfunc():
print('人模狗样')
func()
print('原形毕露')
return newfunc
##方法一
@kuozhan.kuozhan1
def func():
print('我是一名学生')
func()
##方法二
@kuozhan() ##把对象当成函数使用,触发__call__方法
def func():
print('我是一名学生')
func()
##6用带有参数的装饰器修饰原函数
def outer(n):
def kuozhan(func):
def newfunc1(self):
print('饥肠辘辘1')
func(self)
print('呕吐不止1')
def newfunc2(self):
print('饥肠辘辘2')
func(self)
print('呕吐不止2')
if n==1:
return newfunc1
elif n==2:
return newfunc2
elif n==3:
return 5400
return kuozhan
class MyClass():
@outer(1)
def func1(self):
print('文明一大步')
@outer(2)
def func2(self):
print('市级文明')
@outer(3)
def func3(self):
print('人类文明')
obj=MyClass()
#扩展原函数新功能
obj.func1()
obj.func2()
#把方法变成属性
print(obj.func3)
##7.用带有参数的类装饰器装饰原函数
'''
如果参数是1,就为当前这个类添加成员属性和方法
如果参数是2,就把当前这个类中的run方法变成属性
'''
class Kuozhan():
ad='无锡'
def __init__(self,num):
self.num=num
def money(self):
print('江苏')
def __call__(self, cls):
if self.num==1:
return self.kuozhan1(cls)
elif self.num==2:
return self.kuozhan2(cls)
def kuozhan1(self,cls):
def newfunc():
cls.ad=Kuozhan.ad
cls.money=Kuozhan.money
return cls()
def kuozhan2(self,cls):
def newfunc():
if 'run' in cls.__dict__:
cls.run=cls.run()
return cls()
return newfunc
#功能一
@Kuozhan(1)
class MyClass():
def run():
return '世界'
obj=MyClass()
print(obj.ad)
obj.money()
##功能二
@Kuozhan(2)
class MyClass():
def run():
print('世界')
obj=MyClass()
print(obj.run)