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

    # 使用一个函数来装饰另一个函数,不使用@
    
    def a_new_decorator(a_func):
    
        def wrapTheFunc():
            print("Do sth. before a_func()")
    
            a_func()
    
            print("Do sth. after a_func()")
    
        return wrapTheFunc
    
    
    def a_func_requiring_decoration():
        print("I need some decoration")
    
    a_func_requiring_decoration = a_new_decorator(a_func_requiring_decoration)
    
    a_func_requiring_decoration()
    # 输出如下:
    # Do sth. before a_func()
    # I need some decoration
    # Do sth. after a_func()
    # 使用@来运行上面的代码
    
    def a_new_decorator(a_func):
    
        def wrapTheFunc():
            print("Do sth. before a_func()")
    
            a_func()
    
            print("Do sth. after a_func()")
    
        return wrapTheFunc
    
    @a_new_decorator
    def a_func_requiring_decoration():
        print("I need some decoration")
    
    # a_func_requiring_decoration = a_new_decorator(a_func_requiring_decoration)
    
    a_func_requiring_decoration()
    the @a_new_decorator is a just a short way of saying:
    a_func_requiring_decoration = a_new_decorator(a_func_requiring_decoration)
    # 希望print(xx.__name__)的结果是xx,而不是wrapTheFunc
    # 使用functools.wraps来解决此问题
    
    from functools import wraps
    
    
    def a_new_decorator(a_func):
        @wraps(a_func)
        def wrapTheFunc():
            print("Do sth. before a_func()")
    
            a_func()
    
            print("Do sth. after a_func()")
    
        return wrapTheFunc
    
    @a_new_decorator
    def a_func_requiring_decoration():
        print("I need some decoration")
    
    # a_func_requiring_decoration = a_new_decorator(a_func_requiring_decoration)
    
    a_func_requiring_decoration()
    
    print(a_func_requiring_decoration.__name__)

    注意:@wraps接受一个函数来进行装饰,并加入了复制函数名称、注释文档、参数列表等等的功能。这可以让我们在装饰器里面访问在装饰之前的函数的属性。

  • 相关阅读:
    java 锁
    mybatis 基本用法
    MYSQL 数据库
    进程与线程的区别
    EJB类型
    线程创建方式
    JDBC连接数据库的基本步骤
    org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch
    Centos中的/etc/sysconfig/network-scripts/ifcfg-eth0的正确配置
    利用maven导入依赖失败的问题
  • 原文地址:https://www.cnblogs.com/karl-python/p/14626891.html
Copyright © 2011-2022 走看看