装饰器

装饰器

1.形式

  • 装饰器是有python 的@语法和闭包的知识结合使用的

  • 常见的装饰器形式

    def outer(origin):
        def inner():
            '''你猜'''
            print("啊哈哈")#函数执行前
            res=origin()
            print("啊哈哈哈")#函数执行后
        return inner # 返回原函数并且不带括号
    @outer   # 相当与执行 func=outer(func)
    def func():
        print("aaa")
    func()
    
  • def 外函数(函数):
        def 内函数():
            函数()
        return 内函数    
    

2.带参数的装饰器

  • 函数的参数可以有很多,为了接收任意的参数使用的参数是*args**kwargs

  • def outer(origin):
        def inner(*args,**kwargs):
            '''你猜'''
            print("啊哈哈")#函数执行前
            res=origin(*args,**kwargs)
            print("啊哈哈哈")#函数执行后
        return inner # 返回原函数并且不带括号
    @outer   # 相当与执行 func=outer(func)
    def func():
        print("aaa")
    func()
    

3.装饰器的扩展

3.1 补充内置函数
def admin():
    '''这是一个管理员函数'''
    print("adminxxxxx")

# 获取函数的名字
print(admin.__name__)
# 获取函数中的注释
print(admin.__doc__)

image-20211129111254800

  • 被装饰器修饰后
  • def outer(orign):
        def inner(*args,**kwargs):
            '''这是装饰器内的函数'''
            res=orign(*args,**kwargs)
        return inner
    
    @outer
    def admin():
        '''这是一个管理员函数'''
        print("adminxxxxx")
    
    # 获取函数的名字
    print(admin.__name__)
    # 获取函数中的注释
    print(admin.__doc__)
    
  • image-20211129111833611

  • 经过装饰器修饰后,获得的函数名是装饰器内的函数名与注释,被装饰的函数相当于为函数前后添加功能

3.2 functools
  • import functools
    
    def outer(orign):
        # inner.__name__=orign.__name__;inner.__doc__=orign.__doc__;
        @functools.wraps(orign)
        def inner(*args,**kwargs):
            '''这是装饰器内的函数'''
            res=orign(*args,**kwargs)
        return inner
    
    @outer
    def admin():
        '''这是一个管理员函数'''
        print("adminxxxxx")
    
    # 获取函数的名字
    print(admin.__name__)
    # 获取函数中的注释
    print(admin.__doc__)
    
  • image-20211129112724330

  • 因此:编写装饰器的时候可以加上@functools.wraps(函数参数)

天雨虽宽不润无根之草,学习虽难勤奋可达巅峰;

原文地址:https://www.cnblogs.com/Blogwj123/p/15618626.html