现在有五个人要玩王者荣耀,其中三个人,露西,莉莉,铁锤的手机没电了,只能告诉伙伴,我手机没电了,玩不了。
def lucy(): print("我是露西,手机没电了,玩不了") def lili(): print("我是莉莉,手机没电了,玩不了") def tiechui(): print("我是铁锤,手机没电了,玩不了")
这个时候,三个人,发现旁边有共享充电宝可以用,手机充上电了,然后我要让别人知道,我可以玩了。我们可以怎么办呢?
def chong_dian_bao(): print("手机可以充电了,充上电了,可以找我玩了") def lucy(): print("我是露西,手机没电了,玩不了") chong_dian_bao() def lili(): print("我是莉莉,手机没电了,玩不了") chong_dian_bao() def tiechui(): print("我是铁锤,手机没电了,玩不了") chong_dian_bao()
这样也是可以的,但是问题是把这三个人代码都改了,假如一会儿网络中断了,不能玩了。这三个人里又得再加一些代码。这样改来改去最后就会越来越乱。
我们可不可以在不改变三个人代码的前提下,通知别人可以玩了这个消息呢?可以这样
# 第一步,定义一个装饰器 def chong_dian_bao(fun): def nei(fun): fun() print("手机可以充电了,充上电了,可以找我玩了") return nei(fun) def lucy(): print("我是露西,手机没电了,玩不了") def lili(): print("我是莉莉,手机没电了,玩不了") def tiechui(): print("我是铁锤,手机没电了,玩不了") chong_dian_bao(lucy) chong_dian_bao(lili) chong_dian_bao(tiechui)
这样是实现了,不改变原来代码的情况下,通知别人“可以玩了”的功能。问题是 chong_dian_bao(lucy) 这样写,让人以为执行的是“充电宝”,而不是露西本人的消息
我们也可以用第二种
# 第一步,定义一个装饰器 def chong_dian_bao(fun): def nei(): fun() print("手机可以充电了,充上电了,可以找我玩了") return nei def lucy(): print("我是露西,手机没电了,玩不了") def lili(): print("我是莉莉,手机没电了,玩不了") def tiechui(): print("我是铁锤,手机没电了,玩不了") chong_dian_bao(lucy)() chong_dian_bao(lili)() chong_dian_bao(tiechui)()
这样也是可以实现我们的功能,问题和第一种写法类似,chong_dian_bao(lucy)()表达的不清晰,不知道这个执行的主体是chogndianbao() 还是lucy()
为了更简洁明了,python提供了专门的装饰器功能,约定将要添加的功能 用@chogng_dian_bao的方式,添加在原函数上。想不想一个将充电宝直接放在了露西的身上的感觉
def chong_dian_bao(fun): def nei(): fun() print("手机可以充电了,充上电了,可以找我玩了") return nei @chong_dian_bao def lucy(): print("我是露西,手机没电了,玩不了") @chong_dian_bao def lili(): print("我是莉莉,手机没电了,玩不了") @chong_dian_bao def tiechui(): print("我是铁锤,手机没电了,玩不了") lucy() lili() tiechui()
装饰器本身是一个函数,是一个闭包函数,它实现了某种功能,比如充电功能,如果想把这个功能给其他函数用,只需要在这个函数的上面加上@ chong_dian_bao 。
装饰器是帽子,谁需要了,戴上就行了,@装饰器就戴上了。如果不需要了,去掉@装饰器就行了