zoukankan      html  css  js  c++  java
  • Python-装饰器(Decorator)

    装饰器的思想

    装饰器是建立在Python中函数可以作为参数传递和返回的基础上,作用是对函数的功能和行为做扩充和延展,但是这个过程不会修改原函数的逻辑,所以叫装饰而不是修改。

    装饰器的基本实现逻辑:

    • 传入目标函数(func)
    • 创建新函数(Wrapper)
    • 在Wrapper中执行func同时添加扩展功能
    • 返回新函数Wrapper

    从逻辑中我们看出,装饰器的行为是用一个扩充过功能的新函数替换原函数,这个过程是在代码加载中完成的,被装饰过的函数实际上已经是装饰器返回的的新函数了。

    由于装饰器返回的新函数中元数据已经发生了变化,为了保持新函数元数据和旧函数相同,可以使用@functools.wraps(f)装饰新函数Wrapper。

    装饰器举例

    1. 不带参数的装饰器
    def decorator(f):
        @functools.wraps(f)
        def wrapper(*args, **kwargs):
            print("decorator without param")
            return f(*args, **kwargs)
        return wrapper
    
    @decorator
    def func(word):
        print("word is: " + word)
    
    

    @decorator是python语法糖,语法糖就是换一种方式执行既定的功能,@decorator等同于func = decorator(func)

    2. 带参数的装饰器
    def route(rule):
    
        def decorator(f):
            @functools.wraps(f)
            def wrapper(*args, **kwargs):
                print(rule)
                print("decorator with params")
                return f(*args, **kwargs)
            return wrapper
        return decorator
    
    @route('/app')
    def func(word):
        print("word is: " + word)
    

    @route('/app')等同于func = route('/app')(func)

  • 相关阅读:
    CF 1119 题解
    CF 582 题解
    CF 1098 题解
    CF 1129 题解
    CF 513 题解
    CF 417 D 题解
    ingress nginx遇到502错误,connect() failed (113 Host is unreachable) while connecting to upstream
    MySQL性能剖析
    MySQL的基准测试
    MySQL架构与历史
  • 原文地址:https://www.cnblogs.com/Peter2014/p/11264833.html
Copyright © 2011-2022 走看看