兄弟连学python(06)装饰器:对类或者函数进行功能的扩展


#第一步,基本函数
'''
def hulk():
print("酒逢知己饮,诗向会人吟!")
#调用函数
hulk()

 


#第二步 扩展函数功能(不能修改原函数)
#用于扩展基本函数的函数
def kuozhan(func):
#扩展功能1
print("写诗之前,做好准备!")

#调用基本函数
func()

# 扩展功能1
print("写完之后,感谢佛祖!")

#基本函数
def hulk():
print("酒逢知己饮,诗向会人吟!")

#扩展之后的函数重新赋值给基本函数
hulk=kuozhan(hulk)
print(hulk)


#第三步 使用语法糖(就是语法)@语法

#用于扩展基本函数的函数
def kuozhan(func):
#扩展功能1
print("写诗之前,做好准备!")

#调用基本函数
func()

# 扩展功能1
print("写完之后,感谢佛祖!")

#基本函数
@kuozhan #相当于hulk=kuozhan(hulk)
def hulk():
print("酒逢知己饮,诗向会人吟!")

#扩展之后的函数重新赋值给基本函数

print(hulk)


#第四步 基本装饰器的实现

#用于扩展基本函数的函数
def kuozhan(func):
#内部函数
def newhulk():
#扩展功能1
print("写诗之前,做好准备!")

#调用基本函数
func()

# 扩展功能1
print("写完之后,感谢佛祖!")

#添加返回值
return newhulk

#基本函数
@kuozhan #相当于hulk=kuozhan(hulk)
def hulk():
print("酒逢知己饮,诗向会人吟!")

#扩展之后的函数重新赋值给基本函数

#print(hulk)

#调用函数
hulk()
hulk()


#第五步 带有参数的装饰器和带有返回值的装饰器
#用于扩展基本函数的函数
def kuozhan(func):
#内部函数
def newhulk(shui,na):
#扩展功能1
print("写诗之前,做好准备!祈祷一切顺利")

#调用基本函数
func(shui,na)

# 扩展功能1
print("写完之后,感谢佛祖!写出如此美妙的篇章")

#添加返回值
return newhulk

#基本函数
@kuozhan #相当于hulk=kuozhan(hulk)
def hulk(who,where):
print(who,"在",where,"准备开始写诗")
print("酒逢知己饮,诗向会人吟。相识满天下,知心能几人!")

#扩展之后的函数重新赋值给基本函数

#print(hulk)

#调用函数
hulk("李白","长安")
hulk("杜甫","江南")


#带有函数返回值
#用于扩展基本函数的函数
def kuozhan(func):
#内部函数
def newhulk():
#扩展功能1
print("写诗之前,做好准备!")

#调用基本函数
result=func()

# 扩展功能1
print("写完之后,感谢佛祖!")

#为newhulk添加返回值
return result
#添加返回值
return newhulk

#基本函数
@kuozhan #相当于hulk=kuozhan(hulk)
def hulk():
print("酒逢知己饮,诗向会人吟!")
return "好诗一首666"
#扩展之后的函数重新赋值给基本函数

#print(hulk)

#调用函数
result=hulk()
print("函数的返回值是:",result)
#hulk()


#第六步 带有收集参数的函数的装饰器
def kuozhang(func):
def newhulk(*w,**n):
# 扩展功能1
print("写诗之前,做好准备!祈祷一切顺利")

# 调用基本函数
func(*w,**n)

# 扩展功能1
print("写完之后,感谢佛祖!写出如此美妙的篇章")

return newhulk

def hulk(*who,**nums):
print("参与写诗的人:",who)
print("分别写了:", nums)
print("酒逢知己饮,诗向会人吟!")
#调用函数
hulk("无情","楚天","飞扬",wq="15kg",ct="15g",fy="15t")

 

#第七步 带有参数的装饰器
def outer(arg):

def kuozhan(func):
#未来的hulk函数
def newhulk():
# 扩展功能1
print("写诗之前,做好准备!祈祷一切顺利")

# 调用基本函数
func()

# 扩展功能1
print("写完之后,感谢佛祖!写出如此美妙的篇章")
#未来的吃法函数
def newchifan():
#扩展功能1
print("饭前洗一洗")
#调用基本函数
func()
#扩展功能2
print("饭后抖一抖")

#根据装饰函数的不同,返回不同的结果
if arg == "la":
return newhulk
elif arg == "chi":
return newchifan
#返回装饰器
return kuozhan


#基本函数1
@outer("la") #装饰器函数
def hulk():
print("酒逢知己饮,诗向会人吟!")

#基本函数2
@outer("chi")
def chifan():
print("吃炸鸡,喝啤酒")

#调用函数
#hulk()
chifan()

 


#第八步 使用类作为装饰器的参数

#装饰器使用操作类:
class wish:
def before(): #准备操作
print("写诗之前,做好准备!祈祷一切顺利")
def after(): #完结操作
print("写完之后,感谢佛祖!写出如此美妙的篇章")
#装饰器函数
def outer(cls):
def kuozhan(func):
def newhulk():
# 扩展功能1 (类中存在扩展内容)
cls.before()
# 调用基本函数
func()
# 扩展功能1
cls.after()
return newhulk
return kuozhan
#基本函数
@outer(wish)
def hulk():
print("酒逢知己饮,诗向会人吟!")
#调用函数
hulk()


#第九步 将类作为装饰器使用
class kuozhan:
#接收装饰器参数(函数outer)
def __init__(self,arg): #arg就传过来的"la"
self.arg=arg
#制作一个内部函数(真正的装饰器,函数kuozhan)
def __call__(self,func): #func就是函数hulk
#将func函数存入对象
self.func=func
return self.newhulk
#定义内部函数
def newhulk(self):
print("写诗之前,做好准备!祈祷一切顺利")
self.func()
print("写完之后,感谢佛祖!写出如此美妙的篇章")

#基本函数
@kuozhan("la") #hulk=对象.(hulk)
def hulk():
print("酒逢知己饮,诗向会人吟!")
#调用函数
hulk()

 

#第十步 装饰器装饰一个类

#装饰器函数
def kuozhan(cls):

#声明一个类(函数)
def newhuman():
cls.cloth="飘逸的长发"
cls.hat="漂亮的小帽子"
#调用类(实例化对象)
obj=cls()
#返回实例化对象
return obj

return newhuman
#类(被装饰的类)
@kuozhan #human=kuozhan(human)
class human: #当作一个函数处理 human()的返回值就是对象
age=12
sex="man"
height="342cm"

def liaomei(self):
print("这块砖头是你掉的吗")
def tt(self):
print("不破楼兰终不还")
#实例化对象
ll=human()
print(ll.hat)
print(ll.cloth)

'''

#第十一步 多层装饰器的嵌套
#装饰器1
def kuozhan1(func):
#定义装饰之后的函数
def newhulk1():
print("1-------写诗之前,做好准备!祈祷一切顺利")
func()
print("1-------写完之后,感谢佛祖!写出如此美妙的篇章")

return newhulk1
#装饰器2
def kuozhan2(func):
def newhulk2():
print("2-------写诗之前,做好准备!祈祷一切顺利 脱裤子^_^")
func()
print("2-------写完之后,感谢佛祖!写出如此美妙的篇章,提裤子^_^")

return newhulk2
#基本函数
@kuozhan2
@kuozhan1
def hulk():
print("酒逢知己饮,诗向会人吟。相识满天下,知心能几人!")
#调用函数
hulk()

Python学习交流、资源共享群QQ:563626388 

posted @ 2017-11-19 17:31  酒逢知己饮,诗向会人吟  阅读(139)  评论(0编辑  收藏  举报