• python 基础——装饰器


    python 的装饰器,其实用到了以下几个语言特点:

    • 1. 一切皆对象
    • 2. 函数可以嵌套定义
    • 3. 闭包,可以延长变量作用域
    • 4. *args 和 **kwargs 可变参数

    第1点,一切皆对象,包括函数。函数也是个对象,所以函数这个对象可以和其他任何对象一样被赋值给其它变量,包括作为实数传递给函数。

    第2点,在函数中可以再定义一个函数,并且,结合第1点,函数是个对象,那么嵌套定义的函数,还可以被作为函数执行结果返回,也就是 return object。

    第3点,类似 JS 的特性,就是在嵌套定义的函数销毁前,其外层函数的函数作用域一直存在。

    第4点,则是为了处理参数上的方便。

    普通装饰器

    def decorator(func):
        outer = '外层函数作用域定义的局部变量'
        def inner(*args, **kwargs):
            print outer
            print args
            print kwargs
        return inner
        
    
    @decorator
    def func(*args, **kwargs):
        print 'hello world'
        
    # 以上装饰器作用等价于:
    new_func = decorator(func)
        
    func(1, 2, 3, a='one', b='two')
    new_func(1, 2, 3, a='one', b='two')
    
    # 外层函数作用域定义的局部变量
    # (1, 2, 3)
    # {'a': 'one', 'b': 'two'}
    # 外层函数作用域定义的局部变量
    # (1, 2, 3)
    # {'a': 'one', 'b': 'two'}

    带参数的装饰器

    带参数的装饰器,其实是相当于又多了一层嵌套定义,装饰器函数返回的也是一个装饰器函数。

    def decorator(info):
        def really_dec(func):
            outer = info
            def inner(*args, **kwargs):
                print outer
                print args
                print kwargs
            return inner
        return really_dec
        
    
    @decorator('我是装饰器参数')
    def func(*args, **kwargs):
        print 'hello world'
        
    func(1, 2, 3, a='one', b='two')
    
    # 我是装饰器参数
    # (1, 2, 3)
    # {'a': 'one', 'b': 'two'}
  • 相关阅读:
    Git 从入门到入坑
    单件模式(单例模式)
    装饰者模式
    观察者模式
    设计模式入门
    SpringBoot + Mybatis + Redis 整合入门项目
    Spring Boot 前后端交互及参数传递
    Spring Securtiy 认证流程(源码分析)
    Spring Boot 静态页面跳转
    第一条手机验证码
  • 原文地址:https://www.cnblogs.com/licongyu/p/5768265.html
Copyright © 2020-2023  润新知