zoukankan      html  css  js  c++  java
  • 10.装饰器

    # ### 装饰器
    '''
    扩展函数新功能的@
    定义:替换旧函数,返回新函数,在不改变原有代码的前提下,为该函数扩展新功能;
    语法:@ (语法糖)
    '''
     
    # (1) 装饰器的原型
    def kuozhan(func):
        def newfunc():
            print("厕所前,蓬头垢面")
            func()#print("我是个屌丝")
            print("厕所后,精神气爽")
        return newfunc
         
    def func():
        print("我是个屌丝")    # func = kuozhan(func)
    func = kuozhan(func)  # func = newfunc  <==> func() 就是newfunc() 一样的
    print(func)
     
    # func = kuozhan(func)
    # func()
     
    # (2) 装饰器语法@    
    def kuozhan(func):
        def newfunc():
            print("厕所前,蓬头垢面")
            func()
            print("厕所后,精神气爽")
        return newfunc
    @kuozhan   # func = kuozhan(func)
    def func():
        print("我是个屌丝")
     
     
    '''
    方向:从下到上,把func当成一个参数给装饰器kuozhan,
    返回的新函数覆盖旧函数func,func在调用时,相当于
    调用newfunc(),只不过@自动帮助你实现了这一步,func = kuozhan(func)
    直接调用即可.
    '''
    func()
     
     
    # (3) 装饰器的嵌套
    def kuozhan1(func):
        def newfunc():
            print("厕所前,蓬头垢面1")
            func()
            print("厕所后,精神气爽2")
        return newfunc
     
    def kuozhan2(func):
        def newfunc():
            print("吃饭前,洗洗手3")
            func()
            print("吃饭后,簌簌口4")
     
        return newfunc
     
     
    @kuozhan1
    @kuozhan2
    def func():
        print("我是白富美5")
      
    func()
    '''
    # 第一步:
    @kuozhan2
    def func():
        print("我是白富美5")
    # 结果:
    def func():
        print("吃饭前,洗洗手3")
        print("我是白富美5")
        print("吃饭后,簌簌口4")
     
    # 第二部
    @kuozhan1
    def func():
        print("吃饭前,洗洗手3")
        print("我是白富美5")
        print("吃饭后,簌簌口4")
     
    # 结果:
    print("厕所前,蓬头垢面1")
        # 作为一个整体调用依次
        print("吃饭前,洗洗手3")
        print("我是白富美5")
        print("吃饭后,簌簌口4")
     
    print("厕所后,精神气爽2")
     
    # 整体返回
    '''
     
     
    # (4) 带有参数的装饰器
    '''# 如果原函数带有参数,  那么返回的新函数也要带有参数,(参数一一对应)'''
    print("<===>")
    def kuozhan(func):
     
        def new_func(who,where):
            print("厕所前,干净整洁")
            func(who,where)
            print("厕所后,一片狼藉")
        return new_func
     
    @kuozhan
    def func(who,where):
        print("{}在{}里解手".format(who,where))
    func("豪杰","鸟窝")
     
     
    print("<====>")
    # (5) 带有参数返回值的装饰器
    """原函数怎么定义的参数,新函数就那样去定义"""
    def kuozhan(func):
        # 函数的定义处,*args,**kwargs 是收集参数
        def new_func(*args,**kwargs):
            print("厕所前,苟延残喘")
            # * 和 ** 的魔术用法  *[1,2,3] **{'a':1,'b':2} 把容器里面的数据,一个一个拿出来当成参数赋给调用处的func
            lst = func(*args,**kwargs)
            print("厕所后,大言不惭")
             
            return lst
             
        return new_func
     
    @kuozhan
    def func(*args,**kwargs):
        # print(args)
        # print(kwargs)
        print(args)
        dictvar = {"qhy":"全海毅","hb":"胡斌","hqc":"胡启超"}
        # lst = {dictvar[a]:b  for a,b in kwargs.items() if a in dictvar}
        lst = [dictvar[a]+"生产了"+b+"便便"  for a,b in kwargs.items() if a in dictvar]
        return lst
     
    res = func("电影院","水池",qhy="15克",hb="15斤",hqc="15顿")
    print(res)
    

      

  • 相关阅读:
    骑行的乐趣
    亲子运动会
    【转载】程序员接私活经验总结,来自csdn论坛语录
    【原创】Asp.Net MVC 学习笔记之使用Model验证
    【转载】经典js技巧
    【原创】关于Sqlserver的LogFiles超大的问题
    【总结】Winform编程常用小技巧
    【总结】WebBrowser相关资料索引
    【原创】Asp.Net MVC学习笔记之使用AcceptVerbs标签来制定Action的响应行为
    【转载】一个资深SOHO程序员对新人的建议网上接活(转自CSDN)
  • 原文地址:https://www.cnblogs.com/eliwen/p/11000365.html
Copyright © 2011-2022 走看看