'''
#第一步:创建一个普通函数
def laxi():
print('噗哧噗哧噗哧噗哧~~~')
#调用函数
laxi()
laxi()
'''
'''
#第二步:扩展函数的功能(不是装饰器)
#声明一个扩展函数
def decor(func):
print('求神拜佛,祝愿一切顺利')
func()#相当于调用laxi()
print('拉稀成功,烧香还愿')
def laxi():
print('噗哧噗哧噗哧噗哧~~~')
#将laxi函数传入decor函数中
laxi = decor(laxi)
#调用函数
laxi()
laxi()
'''
'''
#第三步:扩展函数的功能(不是装饰器),使用语法糖
#声明一个扩展函数
def decor(func):
print('求神拜佛,祝愿一切顺利')
func()#相当于调用laxi()
print('拉稀成功,烧香还愿')
@decor #将laxi函数传入decor函数中#laxi = decor(laxi)
def laxi():
print('噗哧噗哧噗哧噗哧~~~')
#调用函数
laxi()
laxi()
'''
'''
#第四步:实现基本的装饰器
def decor(func):#函数名随便写
#声明内部函数来制作完整的装饰函数
def _decor():#函数名随便写
print('求神拜佛,祝愿一切顺利')
func()#相当于调用laxi()
print('拉稀成功,烧香还愿')
return _decor
@decor#laxi = decor(laxi)
def laxi():
print('噗哧噗哧噗哧噗哧~~~')
#调用函数
laxi()
laxi()
laxi()
laxi()
'''
'''
#第五步:实现带有参数和返回值的哦装饰器
#装饰器
def decor(func):
#这就是未来的拉稀函数
def _decor():
print('求神拜佛,祝愿一切顺利')
#调用拉稀函数时接收拉稀函数本身的返回值
result = func()#相当于调用laxi()
print('拉稀成功,烧香还愿')
#为装饰之后的函数返回一个值
return result
#返回内部函数作为未来的laxi函数
return _decor
@decor
#拉稀函数
def laxi():
print('噗哧噗哧噗哧噗哧~~~')
return '热翔一碗'
#调用拉稀函数
jg = laxi()
print(jg)
'''
'''
#装饰器
def decor(func):
#这就是未来的拉稀函数(原函数有什么形参,这里就要有什么形参)
def _decor(who,weight):
print('求神拜佛,祝愿一切顺利')
#调用拉稀函数时接收拉稀函数本身的返回值
result = func(who,weight)#相当于调用laxi()
print('拉稀成功,烧香还愿')
#为装饰之后的函数返回一个值
return result
#返回内部函数作为未来的laxi函数
return _decor
@decor
#拉稀函数
def laxi(who,weight):
print('噗哧噗哧噗哧噗哧~~~:'+who+'拉了'+weight+'斤便便')
return '热翔一碗'
jg = laxi('马俊龙','10')
print(jg)
'''
'''
#第六步:收集参数装饰器(给装饰器内部的函数加参数)
def decor(func):
#返回未来的拉稀函数
def _decor(*who,*weight):
print('求神拜佛,祝愿一切顺利')
result = func(*who,**weight)
print('拉稀成功,烧香还愿')
return result
#返回装饰之后的函数
return _decor
@decor
def laxi(*who,**weight):
print('噗哧噗哧噗哧噗哧~~~')
print('参与拉屎的人有:',who)
print('分别拉了多少:',weight)
return '热翔一大锅!'
#调用函数
jg = laxi('马俊龙','阎瑞龙','霍云瑞','曹睿','宋笑寒',mjl = '5斤',yrl = '2斤',hyr= '1吨',cr = '10克',sxh = '便秘')
print(jg)
'''
'''
#第七步:带有参数的装饰器(给装饰器加参数)
#定义装饰器(接收装饰器参数)
def decor(arg):
#接收函数的参数
def _decor(func):
#未来的拉稀和吃饭函数的装饰
def __decorla():#未来的拉稀函数
print('求神拜佛,祝愿一切顺利')
result = func()
print('拉稀成功,烧香还愿')
return result
def __decorchi():#未来的吃饭函数
print('我要开动了~')
result = func()
print('我吃完了~')
return result
#根据装饰器的参数返回不同的装饰结果
if arg == 'la':
return __decorla
elif arg == 'chi':
return __decorchi
#返回装饰器的第一层
return _decor
@decor('la')
def laxi():
print('噗哧噗哧噗哧噗哧~~~')
return '热翔一碗'
@decor('chi')
def chifan():
print('吧唧吧唧吧唧吧唧!~~~')
return '空碗一个'
#调用laxi
jg = laxi()
print(jg)
#调用chifan
jg = chifan()
print(jg)
'''
'''
#第八步:将类作为装饰器参数传入进来
#祝愿祈福类
class Wish:
#绑定类的方法
def before():
print('烧香拜服,祝愿一切顺利!')
#绑定类的方法
def after():
print('拉稀成功,烧香还愿~')
#装饰器
def decor(cls):
def _decor(func):
#这是未来的拉稀函数
def __decor():
cls.before()
result = func()
cls.after()
return result
#返回装饰之后的函数
return __decor
return _decor
@decor(Wish)
def laxi():
print('噗哧噗哧噗哧噗哧~~~')
return '热翔一手'
#调用函数
jg = laxi()
print(jg)
'''
'''
#第九步:将类作为装饰器使用
class Decor:
def __init__(self,arg):
#存入对象
self.arg = arg
#此魔术方法用于接收原函数
def __call__(self,func):
#将原方法存到对象当中
self.func = func
#返回装饰之后的函数
return self.mylaxi
#装饰函数
def mylaxi(self):
print('烧香拜服,祝愿一切顺利!')
#调用原函数
result = self.func()
print('拉稀成功,烧香还愿~')
return result
@Decor(5)
def laxi():
print('噗哧噗哧噗哧噗哧~~~')
return '热翔一手'
jg = laxi()
print(jg)
'''
'''
#第十步:为类添加装饰器(单例模式)
#声明一个容器用于存放对象
obj = {}#假设存入的对象键名only 值为对象本身 {'only':对象}
def decor(cls):
#装饰器的操作
def _decor():
if 'only' in obj:
#对象已经创建
return obj['only']
else:
#对象没有创建,创建对象并返回
obj['only'] = cls()
return obj['only']
#返回装饰的操作
return _decor
#当前类只能实例化一个对象
@decor
class LiXue:
name = '小雪'
sex = '女'
age = '21岁'
def stuPy():
print('好好学习天天向上!')
#实例化第一个对象
one = LiXue()
print(one)
two = LiXue()
print(two)
three = LiXue()
print(three)
'''
#第十一步:多个装饰器嵌套
#装饰器1
def decor1(func):
def _decor1():
print('脱裤子,准备放炮')
result = func()
print('拉屎完毕,提裤子走人~')
return result
return _decor1
#装饰器2
def decor2(func):
def _decor2():
print('烧香拜佛,祝愿一切顺利!')
result = func()
print('操作成功,烧香还愿')
return result
return _decor2
@decor2
@decor1
def laxi():
print('扑哧扑哧扑哧扑哧扑哧~~')
return '热翔一大杯'
jg = laxi()
print(jg)
python装饰器的十种用法
最新推荐文章于 2023-12-08 10:30:00 发布