【python开发笔记】-- python装饰器

装饰器: 不修改被装饰对象的源代码,也不修改调用方式的前提下,给被装饰对象添加新的功能

原则:开放封闭原则

开放:对扩展功能(增加功能开放),扩展功能的意思是在源代码不做任何改变的情况下,为其增加功能

封闭:对修改源代码是封闭的

无参装饰器

基本模板

Python 复制代码
# 装饰器基本模板 -- 无参装饰器
def outer(func):
    def wrapper(*args, **kwargs):
        
        # 在这里要装饰之前的功能
        
        res = func(*args, **kwargs)

        # 在这里要装饰之后的功能
        
        return res
    return wrapper

案例演示

Python 复制代码
# 案例演示
import time
# 使用装饰器为函数增加计时功能
def count_time(func):
    def wrapper(*args, **kwargs):

        # 在这里要装饰之前的功能
        start_time = time.time()

        res = func(*args, **kwargs)

        # 在这里要装饰之后的功能
        end_time = time.time()
        print('函数执行一共耗时{}秒'.format(start_time-end_time))

        return res
    return wrapper

# 功能函数
@count_time  # 使用装饰器对 time_func()进行装饰,增加了计时的功能
def time_func(n):
    time.sleep(n)
    print('{}秒后,打印这句话'.format(n))

if __name__ == '__main__':
    time_func(5)

pycharm模板功能

使用pycharm自带的模板功能,快速创建模板

复制模板代码 ------> file ------>settings ------> editor ------> Live Templates (实时模板)

进入 Live Templates :

1、展开python,点击+ 选择 live Template

2、Abbreviation 输入快捷指令 , Description 输入模板描述, template text 粘贴进模板内容

3、点击difine ,勾选python。

完成之后,可以直接在代码编辑区输入快捷指令调出模板

完美伪装

将原函数的一些方法,传给装饰器,达到完美伪装

完美伪装的装饰器模板

Python 复制代码
from functools import wraps
def outer(func):
    @wraps(func)  # 用处是将原函数的属性传给装饰函数
    def wrapper(*args, **kwargs):

        # 在这里要装饰之前的功能

        res = func(*args, **kwargs)

        # 在这里要装饰之后的功能

        return res
    return wrapper

通过 from functools import wraps 引入一个 @wraps的装饰器,将源函数的一些属性传递给装饰器。比如:

Python 复制代码
print(time_func)  # 查看函数的内存地址
print(time_func.__name__)  # 查看函数的函数名
print(time_func.__doc__) # 查看函数的描述文档

案例:

Python 复制代码
import time
from functools import wraps
# 使用装饰器为函数增加计时功能
def count_time(func):
    @wraps(func)  # 用处是将原函数的属性传给装饰函数
    def wrapper(*args, **kwargs):

        # 在这里要装饰之前的功能
        start_time = time.time()

        res = func(*args, **kwargs)

        # 在这里要装饰之后的功能
        end_time = time.time()
        print('函数执行一共耗时{}秒'.format(start_time-end_time))

        return res
    return wrapper

# 功能函数
@count_time  # 使用装饰器对 time_func()进行装饰,增加了计时的功能
def time_func(n, i):
    """
    这个是一个被装饰函数
    @param n:
    @param i:
    @return:
    """
    time.sleep(n)
    print('{}秒后,打印{}'.format(n, i))

if __name__ == '__main__':
    # time_func(5, 'A')

    print(time_func)  # 查看函数的内存地址
    print(time_func.__name__)  # 查看函数的函数名
    print(time_func.__doc__) # 查看函数的描述文档

有参装饰器

模板

Python 复制代码
def g_outer(X):
    def outer(func):
        def wrapper(*args, **kwargs):
    
            # 在这里要装饰之前的功能
    
            res = func(*args, **kwargs)
    
            # 在这里要装饰之后的功能
    
            return res
        return wrapper
    return outer

应用有参装饰器时 @g_outer('X')

相关推荐
碱化钾15 分钟前
学习笔记——GPU训练
笔记·学习
wan5555cn1 小时前
国产电脑操作系统与硬盘兼容性现状分析:挑战与前景评估
人工智能·笔记·深度学习·机器学习·电脑·生活
流星白龙1 小时前
【Qt】1.安装QT
开发语言·qt
励志不掉头发的内向程序员1 小时前
【Linux系列】解码 Linux 内存地图:从虚拟到物理的寻宝之旅
linux·运维·服务器·开发语言·学习
摇滚侠2 小时前
Spring Boot 3零基础教程,创建第一个 Spring Boot 3 应用,Spring Boot 3 外部配置,笔记03
java·spring boot·笔记
superxxd3 小时前
跨平台音频IO处理库libsoundio实践
开发语言·qt·音视频
_OP_CHEN5 小时前
C++基础:(十二)list类的基础使用
开发语言·数据结构·c++·stl·list类·list核心接口·list底层原理
Bellafu6665 小时前
selenium常用的等待有哪些?
python·selenium·测试工具
小白学大数据6 小时前
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
爬虫·python·ajax
2401_841495647 小时前
【计算机视觉】基于复杂环境下的车牌识别
人工智能·python·算法·计算机视觉·去噪·车牌识别·字符识别