zoukankan      html  css  js  c++  java
  • 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'}
  • 相关阅读:
    Adapter 适配器模式
    词法分析器的作用
    文法、语言、正则表达式
    基于Windows的套接字相关函数及示例
    迭代器和生成器
    反射的使用
    hasattr、getattr、setattr反射
    socket建立tcp、udp链接
    异常处理
    描述符——类型检测,待补充……
  • 原文地址:https://www.cnblogs.com/licongyu/p/5768265.html
Copyright © 2011-2022 走看看