python 装饰器

目录

  为什么要使用装饰器

  装饰器

  装饰器参数

  装饰器语法糖和修补功能

为什么要使用装饰器

  我们完成一个测试的框架、一个web应用等一些已经可以工作的代码, 随着时间和需求的不断变化,

  需要我们进一步去开发框架,在原有的功能上添加一些功能或者改变,这就需要装饰器。

装饰器

  ’装饰’代指为被装饰对象添加新的功能,’器’代指器具/工具,装饰器与被装饰的对象均可以是任意可调用对象。

  作用:装饰器的作用就是在不修改被装饰对象源代码和调用方式的前提下为被装饰对象添加额外的功能。

  装饰器的模板:

def outer(func):
    def inter(*args,**kwargs):
        print('执行被装饰之前 你可以做的操作')
        res = func(*args,**kwargs)
        print('执行被装饰函数之后 你可以做的操作')
        return res
    return inter

  被装饰函数

def printInfo():
    print("我是被装饰函数")

  完整的装饰器函数

def outer(func):
    def inter(*args,**kwargs):
        print('执行被装饰之前 你可以做的操作')
        res = func(*args,**kwargs)
        print('执行被装饰函数之后 你可以做的操作')
        return res
    return inter

@ outer
def printInfo():
    print("我是被装饰函数")

printInfo()

# output
# 执行被装饰之前,你可以做的操作
# 我是被装饰函数
# 执行被装饰函数之后,你可以做的操作	

装饰器有参和无参

# 将被装饰的函数(无参)
# import time
# def index():
#     time.sleep(1)
#     print('hello world')

# 将被装饰的函数(有参)*args,**kwargs
# def login(name):
#     time.sleep(1)
#     print('%s is a good man'%name)
#     return 'hello'

# 装饰器
# def outer (func):
#     def my_time(*args,**kwargs):
#         start = time.time()
#         func(*args,**kwargs)  # func = index函数的地址  函数名加括号直接调用
#         end = time.time()
#         print('index程序运行的时间是:%s'%(end-start))
#     return my_time
# index = outer(index)  # outer(index的地址)
# index()
# print(index)  # <function outer.<locals>.my_time at 0x000001498C362AE8>
# login = outer(login)
# login('egon')

装饰器语法糖和修补功能

  语法糖:@+装饰器函数名后面没有括号,放在紧挨着被装饰函数的上面       

  修补功能:

    1. 首先在装饰器前写一个:from functools import wraps 

     2. 然后在装饰器的内部和外部函数之间加上@wraps(func)括号内为参数

  列子:

from functools import wraps
def outer (func):
    @wraps(func)
    def my_time(*args,**kwargs):
        start = time.time()
        res = func(*args,**kwargs)  # func = index函数的地址  函数名加括号直接调用
        end = time.time()
        print('index程序运行的时间是:%s'%(end-start))
    return my_time

# 被装饰的函数
# import time
# @outer  # login = outer(login)
# def login(name):
#     time.sleep(1)
#     print('%s is a good man'%name)
#     return 'hello'
# login('egon')

# 被装饰的函数
import time
@outer  # index = outer(index)
def index():
    """
    index 的注释
    :return:
    """
    time.sleep(1)
    print('hello world')
index()
print(help(index))
print(index.__name__)

  修补功能的两个作用:

    1. 用户查看被装饰器装饰的函数名时,看到的还是被装饰函数本身。

print(index.__name__)

    2. 用户查看被装饰函数的注释时,查看到的还是被装饰函数的注释。

print(help(index))

 

posted @ 2021-11-02 09:58  zhuang6  阅读(31)  评论(0)    收藏  举报