• 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 。

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

  • 相关阅读:
    如何在windows下搭建PHP运行环境?
    如何安装Moodle课程包
    2009人工智能与教育应用国际学术会议 (ICAIE'09)
    利用EasyPHP搭建Moodle平台(转)
    SharePoint Server 2007序列号 (转 )
    2009 International Conference on ELearning, EBusiness, Enterprise Information Systems, and EGovernment (EEEE 2009)
    第二届IEEE信息技术与教育国际会议
    原创:利用APMserv快速搭建Moodle平台
    PHP数组的定义、初始化和数组元素的显示
    office2007新建 Microsoft Office Word 文档.docx,打开后弹出转换文件对话框的解决办法
  • 原文地址:https://www.cnblogs.com/chaojiyingxiong/p/13446866.html
Copyright © 2020-2023  润新知