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)

  • 相关阅读:
    重构学习资源
    cannot be cast to javax.servlet.Servlet 解决
    官网下载eclipse
    mapreduce.Job: Running job: job_1553100392548_0001
    IDEA取消形参名显示
    windows下和linux下运行jar
    idea打包可执行jar
    mkdir: Cannot create directory /file. Name node is in safe mode.
    IDEA2018激活码
    HADOOP集群搭建
  • 原文地址:https://www.cnblogs.com/Peter2014/p/11264833.html
Copyright © 2011-2022 走看看