Python装饰器探究

2023-11-07

说在前边

装饰器作为Python中的一个比较实用的东西,在我们日常库的使用过程中经常使用。但是其细节问题我们却常常忘记考虑,本文章就此问题写建装饰器代码来进行一步一步分析。


装饰器实验

1.我们常见的装饰器使用方式

from functools import wraps

def test_wrapper(func):
    @wraps(func)
    def inner_wrapper():
        print("Use inner_wrapper")
        func()

    return inner_wrapper


@test_wrapper
def func2():
    print("Use func2") 

2.装饰器可以进一步简化,留下最重要的部分

def test_wrapper2(func):
    def inner_wrapper():
        pass

    return inner_wrapper

@test_wrapper2
def func3():
    pass

调用func3()发现输出为空。
那我们便可以看出装饰器的实际运作方式

python解释器会call这个被@的函数名称,并向其中传入被装饰函数名称,例

def A(func):
	pass
	
@A
def func():
	pass
	
func()
"""
就相当于是
把func()的调用
换成了A(func)(),故这里A函数返回的一定是一个可以被调用(call)的函数,否则会报错
"""

3.研究深入,向装饰器中传入值

from functools import wraps


# 在装饰器中使用额外参数
def another_keyword(another_keyword=None):
    def test_func(func):
        @wraps(func)
        def func_wrapper():
            if another_keyword == 1:
                print("Use another_keyword")
            else:
                print("Not use another_keyword")
            print("Using func_wrapper")
            func()

        return func_wrapper

    return test_func

@another_keyword(another_keyword=1)
def func():
    print("Use func")

根据上方的分析,我们这次在调用func这个函数的时候就相当于以下流程

another_keyword(another_keyword=1)(func)()

可能有点复杂,需要再进行思考,不过接下来我们会使用一种更适合传参的装饰器

4.更加强大,用类实现装饰器

from functools import wraps


class cls_wrapper(object):
    def __init__(self):
        pass

    def __call__(self, func):
        @wraps(func)
        def inner_wrapper():
            func()

        return inner_wrapper
                
@cls_wrapper()
def func4():
    print("Use func4")

在一个类中,我们定义了__call__方法,也就是说,这个类的实例可以像函数一样被调用,我们只需要实例化这个类就可以当做装饰器使用了。
这样做的好处是,我们在实例化类的时候,可以传入初始化的参数,就不用向上边那样对函数进行层层闭包了。

今天的探究就到这里!谢谢大家观看!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python装饰器探究 的相关文章

随机推荐

  • jvm的学习方法

    jvm详解 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中 居左 居右 SmartyPa
  • debug常规的基本使用

    1 debug启动 在需要的调试的地方打上断点 然后右键debug启动 2 窗口调试功能 1 终止 程序终止 2 放行 有断点则调到下一个断点 没有则直接有运行完 3 跳到下一行 4 进入方法 3 快捷键 F8 跳到下一行 F9 放行 到下
  • Pandas提取数据的几种方式

    文章目录 前言 Pandas读取数据的几种方式 1 read csv 2 read excel 3 read sql 总结 前言 快期末了 数据挖掘的大作业需要用到python的相关知识 这太难为我这个以前主学C 的人了 不过没办法还是得学
  • Oracle 9i中表的在线重定义

    Oracle 9i中表的在线重定义 今天遇到要把数据库中的某张表改成分区表 而且该表在别的地方还有其他的注册信息 如果自己手工建一个分区表的替代该表的话 那就得要手工地去执行该表在其他地方的注册 所以不想删除该表再手工创建同名的分区表 想到
  • 前端预览下载pdf文件

    合同预览 拿到需要合同显示的数据 后台需要的参数 将参数经过base64编码传给后台 后段规定 问题 base64可能会将某些字符串符号编译为空格 后台返回一个文件地址 创建a标签 href指向返回的文件地址 function viewCo
  • Lecture13_光线追踪1(Whitted-Style Ray Tracing)_GAMES101 课堂笔记

    引入光线追踪目的 因为光栅化不能很好地处理全局效果 例如 软阴影 光栅化需要经过两个过程才能形成软阴影 Glossy 反射 既有反射 又有本身材质的粗糙性影响 间接反射 光线在空间中会反射很多次 很难渲染 光栅化速度快 但是质量并不好 表现
  • 如何重新启动k8s集群,并查看的状态

    重新启动k8s集群的方法取决于您使用的部署方式 如果您使用的是kubeadm部署 可以使用以下命令重启集群 kubeadm reset kubeadminit 如果您使用的是其他部署工具 请按照该工具的说明操作 查看集群状态可以使用kube
  • C#显式实现接口函数

    如果一个类实现了一个接口 他可以选择显示实现这个接口 如果显示实现了接口的话 要调用接口的方法 就必须将类型转换为接口去调用 如果要使用类的实例去调用 就必须为类实现该接口函数 例如 interface IShowMessage void
  • Vue3:Typescript与组合式API、defineProps、defineEmits等使用

    标注类型 props 使用 defineProps 使用
  • 【SQL Server 2016】&【SSMS 17】安装

    一 SQL Server 2016安装 1 1 光盘映像下载 SQL Server Downloads 1 2 安装光盘映像 首次安装点击 全新SQL Server独立安装或向现有安装添加功能 产品密钥自动输入 下一步 勾选 我接受许可条款
  • 解决yolov7bug(Command ‘git tag‘ returned non-zero exit status 128.)(IndexError: list index out of ran)

    1 问题 执行train py Command git tag returned non zero exit status 128 原因 使用预训练权重 但路径错误 未找到本地预训练权重 它会自动下载 下载被墙 解决方法 从github下载
  • 透视投影详解

    透视投影详解 概述 投影变换完成的是如何将三维模型显示到二维视口上 这是一个三维到二维的过程 你可以将投影变换看作是调整照相机的焦距 它模拟了为照相机选择镜头的过程 投影变换是所有变换中最复杂的一个 视锥体 视锥体是一个三维体 他的位置和摄
  • electron 获取电脑mac地址遇到的坑

    最近公司需求做一个exe程序 无奈只是一个小前端 只能使用electron来实现了 其中一个需求就是每个账号绑定唯一的电脑 这里选用网卡的mac地址来做这个唯一的字段 代码很简单 测试也很顺利 const mainWindow new Br
  • 房地产投资占GDP比例畸高 中国房地产泡沫是一颗毒瘤

    转 http house ifeng com detail 2014 05 04 46139202 0 shtml 房地产投资占GDP比例畸高 2013年房地产投资占GDP比例高达16 而事实上从1960年来但凡房地产投资占GDP比例高于6
  • 昇思MindSpore安装教程

    目录 昇思MindSpore安装教程 MindSpore 安装MindSpore 开始安装 创建虚拟环境 进入工作目录 下载完成 验证是否成功安装 关注MindSpore社区官方号 昇思MindSpore安装教程 MindSpore 它是华
  • [js] : js 设置 style 的 important

    const div document getElementById xxx div style setProperty height 100px important api 详情 参见 CSSStyleDeclaration getProp
  • 论文笔记:Blockchain in Industries: A Survey

    一 基本信息 论文题目 Blockchain in Industries A Survey 发表时间 IEEE Access 2019 作者及单位 二 摘要 区块链技术近来已成为研究和工业界的最前沿 因为它们为许多行业带来了潜在的好处 这是
  • 02_Numpy学习笔记(下):随机采样

    02 Numpy学习笔记 下 随机采样 文章目录 02 Numpy学习笔记 下 随机采样 一 离散型随机变量的分布 1 二项分布 2 泊松分布 3 超几何分布 二 连续型随机变量的分布 1 均匀分布 2 正态分布 3 指数分布 三 其他随机
  • 华为OD机试真题 Java 实现【日志采集系统】【2023Q1 100分】,附详细解题思路

    目录 一 题目描述 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 一 题目描述 日志采集是运维系统的的核心组件 日志是按行生成 每行记做一条 由采集系统分批上报 如果上报太频繁
  • Python装饰器探究

    说在前边 装饰器作为Python中的一个比较实用的东西 在我们日常库的使用过程中经常使用 但是其细节问题我们却常常忘记考虑 本文章就此问题写建装饰器代码来进行一步一步分析 装饰器实验 1 我们常见的装饰器使用方式 from functool