当前位置 主页 > 服务器问题 > Linux/apache问题 >

    Python高级特性之闭包与装饰器实例详解

    栏目:Linux/apache问题 时间:2019-11-21 10:21

    本文实例讲述了Python高级特性之闭包与装饰器。分享给大家供大家参考,具体如下:

    闭包

    1.函数参数:

    (1)函数名存放的是函数的地址
    (2)函数名()存放的是函数内的代码
    (3)函数名只是函数代码空间的引用,当函数名赋值给一个对象的时候,就是引用传递

    def func01():
      print("func01 is show")
    test = func01
    print(func01)
    print(test)
    test()
    
    

    结果:

    2.闭包:

    (1)内层函数可以访问外层函数变量

    (2)闭包就是一个嵌套定义的函数,在外层运行时才开始内层函数的定义,然后将内部函数的引用传递函数外的对象(闭包外层函数的返回值为内层函数名)

    (3)内部函数和使用的外部函数提供的变量构成的整体称为闭包

    def func_out(rate):
      def func_in(money):
        print(rate * money)
      return func_in
    usa_money = func_out(0.7)
    usa_money(100)
    usa_money(200)
    
    

    执行结果:

    装饰器

    装饰器就是在不改变函数的原有代码的前提下 给函数添加新的功能,装饰器一般是一个闭包。

    1.装饰器:

    # 在不改变函数的原有代码的前提下 给函数添加新的功能
    def func_out(func):
      def func_in():
        print("验证")
        func()
      return func_in
    @func_out
    def login():
      print("登录")
    # 有装饰器 装饰器下面正好是一个函数
    # login = func_out(login)  重点
    login()
    
    

    如果@func_out装饰器下刚好是一个login函数,会执行:

    login = func_out(login)

    所以会直接执行func_out内的代码,func为原login,即指向原login函数的地址空间并且返回内层函数名,即:

    login = func_out(login) = func_in
    
    

    所以login()的执行结果为func_in(),即:

    print('验证')
    func() # func指原login函数的地址
    
    

    就实现了不改变原函数的情况下给函数添加新功能

    执行结果:

    2.装饰有返回指函数:

    def func_out(func):
      def func_in():
        # ret = func()
        #  def login():
        #    return 100
        return func()
      return func_in
    @func_out
    def login():
      return 100
    # login() ==> func_in()
    # func ==> 原始的login
    f = login()
    print(f)
    
    

    3.装饰有参数函数:

    def func_out(func):
      def func_in(a):
        func(a)
      return func_in
    @func_out
    def login(a):
      print(a)
    # login() ==> func_in()
    # func ==> 原始的login
    login(10)
    
    

    4.装饰器通用版:

    def func_out(func):
      def func_in(*args,**kwargs):
        return func(*args,**kwargs)
      return func_in
    @func_out
    def login(*args,**kwargs):
      print(args)
      print(kwargs)
    # login() ==> func_in()
    # func ==> 原始的login
    login(10,20,age = "17",name="123")
    
    

    5.类装饰器:

    class Foo(object):
      def __init__(self, func):
        self.func = func
      def __call__(self):
        print("验证")
        self.func()
    @Foo
    def login():
      print("登录")
    # login = Foo(login)
    login()