python装饰器的意义

现在有五个人要玩王者荣耀,其中三个人,露西,莉莉,铁锤的手机没电了,只能告诉伙伴,我手机没电了,玩不了。

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 。

装饰器是帽子,谁需要了,戴上就行了,@装饰器就戴上了。如果不需要了,去掉@装饰器就行了

posted @ 2020-08-06 15:55  年轻人——001  阅读(311)  评论(0编辑  收藏  举报