装饰器

简介: 装饰器

一、装饰器

在不改变函数逻辑的情况下,为函数添加额外功能


二、装饰器实现代码

先实现质数查询的函数

test_prime.py

# coding=utf-8
"""
    @Project :pachong-master 
    @File    :test_decorator.py
    @Author  :gaojs
    @Date    :2022/7/16 21:12
    @Blogs   : https://www.gaojs.com.cn
"""
import time
def prime_number(num):
    """
    计算是否是质数
    :return:
    """
    if num < 2:
        return False
    elif num == 2:
        return True
    else:
        for i in range(2, num):
            if num % i == 0:
                return False
        return True
def count_prime_number(maxnumber):
    """
    统计质数个数
    :return:
    """
    count = 0
    t1 = time.time()
    for i in range(2, maxnumber):
        if prime_number(i):
            count += 1
            print(count)
    t2 = time.time()
    print(f'***********************总共耗时 {t2 - t1} **************************')
    return count

未带装饰器执行结果

image.png

统计函数执行时长的装饰器

def display_time(func):
    """
    执行此函数耗时计算
    :param func:
    :return:
    """
    def wrapper(*args, **kwargs):
        t1 = time.time()
        result = func(*args, **kwargs)
        t2 = time.time()
        print('***********************总共耗时: {:.4} s **************************'.format(t2 - t1))
        return result
    return wrapper
def prime_number(num):
    """
    计算是否是质数
    :return:
    """
    if num < 2:
        return False
    elif num == 2:
        return True
    else:
        for i in range(2, num):
            if num % i == 0:
                return False
        return True
@display_time
def count_prime_number(maxnumber):
    """
    统计质数个数
    :return:
    """
    count = 0
    for i in range(2, maxnumber):
        if prime_number(i):
            count += 1
            print(count)
    return count
count = count_prime_number(9999)
print(count)

带上装饰器的执行结果

image.png

三、装饰器总结

这里会用到args和kwargs, 如果函数有传参和返回值,则装饰器也要有参数和返回值

def xx1(被装饰函数):
     def xx2(如果被装饰函数有参数那么输入):
             xxxxxxxxxxxxxxx
             被装饰函数(如果被装饰函数有参数那么输入)
             xxxxxxxxxxxxxxx
             # 如果被装饰函数中含有reture则需要返回被装饰函数
             # 没有则不需要
       reture xx2
def xx1(func):
    """
    执行此函数耗时计算
    :param func:
    :return:
    """
    def xx2(*args, **kwargs):
        xxxxxxxxx
        # 如果函数fanc()有返回值,则需要接受返回值
        result = func(*args, **kwargs)
        xxxxxxxxx
        return result
    return wrapper
相关文章
|
1月前
|
JavaScript
03_装饰器
03_装饰器
50 1
|
1月前
22_自定义装饰器
22_自定义装饰器
83 0
|
Python
一日一技:装饰器如何装饰异步函数
一日一技:装饰器如何装饰异步函数
121 0
|
9月前
|
安全
闭包和装饰器
闭包和装饰器
|
存储 JavaScript 前端开发
装饰器语法
利用typeof判定类型的取值范围是:'undefined' /'boolean' /'string' /'number' /'object' /'function' /'symbol' 在JavaScript内部使用typeof判断类型依据的是二进制,根据变量的机器码低位1-3位存储其类型信息,有如下规则:
87 0
|
存储 缓存 关系型数据库
Python装饰器1-闭包与函数装饰器
闭包与函数装饰器:被装饰函数不带参数、被装饰函数带参数、装饰器带参数,装饰器的调用
Python装饰器1-闭包与函数装饰器
|
JSON 数据格式
装饰器的实际应用
使用装饰器模式改造slf4j打印json格式日志
709 0
装饰器的实际应用
|
开发者 Python
装饰器详解|学习笔记
快速学习装饰器详解
83 0
|
Python
Python编程:decorator装饰器
Python编程:decorator装饰器
|
设计模式 JavaScript 前端开发
2021你要知道的前端装饰器(Decorator)
2021你要知道的前端装饰器(Decorator)
633 0