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

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')

         

原文地址:https://www.cnblogs.com/my334420/p/6387688.html