语法糖—装饰器
装饰器,是为了装饰函数用的。当已经写好了的函数想要再加些功能且不想再对原代码进行修改的情况下装饰器就派上了用场。
愉快装逼前的须知
什么是装饰器
装饰器本质就是函数,功能是为其他函数附加功能
装饰器的原则
1、不修改被修饰函数的源代码
2、不修改被修饰函数的调用方式
装饰器的必备装备
高阶函数:
-
函数名作为实参穿给另一个函数
- 返回值包含函数名
嵌套函数:
在一个函数内定义另一个函数
语法糖其实是苦的
想来增加函数的功能时,这样的过程并不是很难实现,但是在装饰器两个原则下面就显得不是那么容易。而且有时当需求的变得复杂时,装饰器的理解也会更不容易理解。下面就来慢慢品味语法糖的苦味。
假如我们是一个体育直播网站的后端开发人员,在前期为了吸引用户,我们选择免费让用户登录。
1 def home(): 2 print("---首页----") 3 4 5 def america(): 6 print("----超级碗----") 7 8 9 def europe(): 10 print("----英超----") 11 12 13 def china(): 14 print("----武林风----")
现在你的领导说现在武林风在观众中的反响强烈,我们也不能光靠广告赚钱。所以,公司做出如下决定,把武林风设立vip用户才能观看。领导还告诉你,现在这些很简易的操作在观众中很受用,不要改变他们的使用习惯。此时,领导已经露出资本家可憎的面容。当你和他提上个月的加班费时,他又双叒叕说了,把这单做完就给你涨工资。你只好勉强应下,回家好好工作。
于是抱着愤恨心情的你完成了如下代码。
无参装饰器
1 def login(func): # 把要执行的模块从这里传进来 func = china 2 3 def inner(): # 再定义一层函数 4 _username = "赵四" # 假装这是DB里存的用户信息 5 _password = "123" # 假装这是DB里存的用户信息 6 username = input("user:") 7 password = input("pasword:") 8 9 if username == _username and password == _password: 10 print("welcome login....") 11 func() #在这里运行china 12 else: 13 print("wrong username or password!") 14 15 16 return inner # 用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数 17 18 19 20 def home(): 21 print("---首页----") 22 23 def america(): 24 print("----超级碗----") 25 26 27 def europe(): 28 print("----英超----") 29 30 @login #在函数前面加一个@就是语法糖 就相当于 china = login(china) 31 def china(): 32 print("----武林风----")
当你憋了一个星期大招,终于把这份代码交到领导面前时,领导用满脸横肉堆砌出了资本家丑恶的笑容。只见他不急不缓地说道,现在不知道怎么的观众对英超也是很感兴趣,你再弄个英超vip,和武林风的vip各自独立,想看两个得掏双份的钱。这时你的心里真是千万头草泥马奔驰而过,心生去意。奈何去年的年终奖还没发完,本着把奖金领完再辞职的心思只好硬着头皮接下了这个活。最终写出了如下代码。
def login(style): def outer(func): # 把要执行的模块从这里传进来 func = china def inner(): # 再定义一层函数 _username = "赵四" # 假装这是DB里存的用户信息 _password = "123" # 假装这是DB里存的用户信息 username = input("user:") password = input("pasword:") if style == "武林风": if username == _username and password == _password: print("welcome login....") func() #在这里运行china else: print("wrong username or password!") elif style == "英超": print("正在开通中.....") func() return inner # 用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数 return outer def home(): print("---首页----") def america(): print("----超级碗----") @login(style = "英超") def europe(): print("----英超----") @login(style = "武林风") #在函数前面加一个@就是语法糖 就相当于 china = login(china) def china(): print("----武林风----")
当你以满怀期待的眼神看着领导时,他一边露出满意的微笑,一边淡定地对你说,现在公司刚刚起步还处在亏损的状态,资金运转不开。等到公司开始盈利的时候,我一定把拖欠你的工资补给你还给你加薪。这次你终于认清了领导丑恶的嘴脸,压抑在心中的怒火喷薄而出,一脚踢翻办公桌,将满载你数百万行心血代码的笔记本砸向领导,转身离开公司。
后来,江湖上又偶有你传说。有的说你自己创业年入千万,也有的说你因为放荡不羁行云流水的代码为世人所知,呼为“金角大王”。
而只有我知道,每当夜幕降临,那辆快速穿梭在长安街拥挤的车流中左手怀抱着妖艳女子右手持着tesla方向盘的男子就是你。