zoukankan      html  css  js  c++  java
  • Python 函数装饰器

    作用

    在不修改原函数定义的前提下,动态地增加函数的功能。

    实现方式

    通过定义一个高阶函数,接受被装饰的函数作为参数,返回一个包装函数。

    例子

    一个打印helloworld的函数,我们需要在函数执行前打印函数名。

    def log(func):
        def wrapper(*args,**kw):
            print('call %s():'%func.__name__)
            return func(*args,**kw)
        return wrapper
    
    @log # 等同于 msg=log(msg)
    def msg():
        print('hello, world')
    

    当给msg加上log的装饰器后,msg实际上已经是wrapper函数了。(print(msg.__name__)结果为wrapper)但有时我们需要原函数名,所以我们可以给wrapper加上functools模块里面的wraps装饰器。

    import functools
    def log(func):
        @functools.wraps(func)
        def wrapper(*args,**kw):
            print('call %s():'%func.__name__)
            return func(*args,**kw)
        return wrapper
    
    @log # 等同于 msg=log(msg)
    def msg():
        print('hello, world')
    

    当然我们也可以自己实现wraps装饰器

    def wraps(func1):
        def decorator(func2):
            def wrapper(*args,**kw):
                return func2(*args,**kw)
            wrapper.__name__=func1.__name__
            return wrapper
        return decorator
    
  • 相关阅读:
    Druid数据库连接池源码分析
    彻底理解Java的Future模式
    CountDownLatch与CyclicBarrier
    Semaphore实现原理分析
    ThreadLocal类分析
    Atomic类和CAS
    synchronized VS Lock, wait-notify VS Condition
    Klass与Oop
    JVM类加载以及执行的实战
    123
  • 原文地址:https://www.cnblogs.com/cknightx/p/7602001.html
Copyright © 2011-2022 走看看