• 装饰器原理介绍和基本实现


    def foo():

      print'foo'

      foo//表示是函数  打印内存地址

       foo()//表示执行foo函数 

    ===========================

    def foo():

      print'foo'

    foo=lambda x:x+1

    foo()//执行下面的lambda表达式,而不是原来的f

    ===============================

    def login(func):   //func=tv

      def inner(*args,**kwargs):  //zy传给arg

        print("passed user verification......")

            return func(*args,**kwargs) //tv

      return inner

          

    //@login

    def home(name):

      print("welcome  [%s]to home page"%name)

    def tv(name,passwd=123):

      print("welcome  [%s]to tv page"%name)

          return 4

    @login

    def moive(name):

      print("welcome  [%s]to moive page"%name)

    //tv=login(tv)------传tv的内存地址

    t=tv("zy",passwd="123")

    print t

    movie(“zy”)

    =============================================

    def Login(request,kargs):

      print('before')

    def Error(request,kargs):

      print('after')

    def filter(before_func,after_func):

      def outer(main_func):

        def wrapper(request,kargs):

               before_result=before_func(request.kargs)

               if(before_result!=None):

              return before_result:

            

           main_result=main_func(request.kargs)

               if(main_result!=None):

              return main_result:

                      after_result=after_func(request.kargs)

               if(after_result!=None):

              return after_result:

        return wrapper

      return outer

    @Filter(Login,Error)

    def Index(request,kargs):

       print("index")

      return ''home page"

    Index('zy','zlj')

    =======================

    @w1

    def show():

      pass

    1.执行w1,把自己装饰的函数的函数名当做参数,w1(show)

    2.show函数重新定义,新show=w1(show)返回值

    ================================

    def w1(main_func):

      def outer(request.kargs):

        print("before")

        main_func(request,kargs)

                print("after")

      return outer

    @w1

    def show():

      print('show')

             

  • 相关阅读:
    Java设计模式
    一个接口多个实现类的Spring注入方式
    Mybatis 中的<![CDATA[ ]]>浅析
    方法内调另一个方法(事务)的探讨
    insertSql语句中的trim标签的使用
    Mybatis-plus的两种分页插件的配置方式
    Mybatis-plus的使用
    spring的IOC,DI及案例详解
    MySQL多表关联数据同时删除
    @Validated和@Valid区别
  • 原文地址:https://www.cnblogs.com/my334420/p/6387688.html
Copyright © 2020-2023  润新知