Python基础教程:装饰器的详细教程

news2025/1/22 12:53:58

前言

嗨喽,大家好呀~这里是爱看美女的茜茜呐

一、什么是装饰器

目的:给func()方法,增加一个功能,在fun()执行期间,同时把fun()执行速率机算出来

import time
def func():
    print('嘻嘻哈哈')


start_time = time.time()
time.sleep(0.1)
func()
end_time = time.time()
print('----> 执行效率%s'%(end_time - start_time))

👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~

python源码、视频教程、插件安装教程、资料我都准备好了,直接在文末名片自取就可


如果,我们给fun1,fun2,fun3,实现相同的功能呢?

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:261823976
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def func():
    print('嘻嘻哈哈')

def timmer(f):
    start_time = time.time()
    time.sleep(0.1)
    f()
    end_time = time.time()
    print('----> 执行效率%s'%(end_time - start_time))

f = func
func = timmer
func(f)

但是,每次都需要将函数作为函数,传递给timmer(),而且这种方式已经破坏了原有的逻辑结构,之前的逻辑结构,是执行fun的同时,计算执行效率,但是现在是把fun传给第三方函数,进行计算。

怎么解决这种问题呢,装饰器。

装饰器就是:在不改动原函数代码前提下,增加额外的功能,装饰的返回值也是一个函数对象。

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:261823976
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def func():
     print('嘻嘻哈哈')


def timmer(f):
    start_time = time.time()
    time.sleep(0.1)
    f()
    end_time = time.time()
    print('----> 执行效率%s'%(end_time - start_time))
    return timmer

f = timmer(func)
f()

@语法糖 : 在定义函数的时候使用,避免再一次赋值操作。

代码修改如下:

def timmer(f):
    start_time = time.time()
    time.sleep(0.1)
    f()
    end_time = time.time()
    print('----> 执行效率%s'%(end_time - start_time))
    return timmer

@timmer
def func():
     print('嘻嘻哈哈')     

二、带参数的装饰器

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:261823976
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import time


def wrapper(f):
    def inner(*args,**kwargs):
        start_time = time.time()
        time.sleep(0.1)
        f(*args,**kwargs)
        end_time = time.time()
        print('----> 执行效率%s' % (end_time - start_time))
    return inner

@wrapper
def fun(a):
    print("%s嘻嘻哈哈" %(a))

@wrapper
def fun1(a,b):
    print('%s嘻嘻哈哈,%s也跟着嘻嘻哈哈' %(a,b))

三、带返回值的装饰器

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:261823976
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def wrapper(f):
    def inner(*args,**kwargs):
        start_time = time.time()
        time.sleep(0.1)
        ret = f(*args,**kwargs)
        end_time = time.time()
        print('----> 执行效率%s' % (end_time - start_time))
        return ret
    return inner

@wrapper
def fun(a):
    s = "%s嘻嘻哈哈" %(a)
    return s

print(name)

总结:

就是 我们调用 fun() 方法,实现原来的功能,并且增加新的功能,前提不能修改源代码。

尾语

上面总结了 Python 调用 JS 的 4 种方式

实际爬虫项目中,一般会先使用 node 命令进行一次测试,确保没问题后,

再使用前 3 种方式的任意一种进行 Python 改写

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇**

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1102235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows版IntelliJ插件SmartInput使用入门

插件设置 CtrlAlts 打开Setting,可以找到SmartInput插件设置页面,也可以通过“右键 -> SmartInput -> 插件设置”快速进入。右键选项打开使用统计可以看到插件为您有效切换输入法的次数。如果您遇到了BUG,右键选项反馈错误日志并复制U…

深入理解强化学习——智能体的类型:有模型强化学习智能体与免模型强化学习智能体

分类目录:《深入理解强化学习》总目录 根据智能体学习的事物不同,我们可以把智能体进行归类。基于价值的智能体(Value-based agent)显式地学习价值函数,隐式地学习它的策略。策略是其从学到的价值函数里面推算出来的。…

AlphaFold-multimer 复合物结构预测

AlphaFold-multimer 复合物结构预测 AlphaFold-multimer是DeepMind开发的AlphaFold项目的一个扩展,旨在预测蛋白质多聚体的三维结构。蛋白质多聚体是由多个蛋白质亚单位相互组装而成的结构,如酶、膜蛋白复合物和病毒颗粒。理解多聚体的结构对于揭示蛋白…

提高编程效率-Vscode实用指南

您是否知道全球73%的开发人员依赖同一个代码编辑器? 是的,2023 年 Stack Overflow 开发者调查结果已出炉,Visual Studio Code 迄今为止再次排名第一最常用的开发环境。 “Visual Studio Code 仍然是所有开发人员的首选 IDE,与专业…

数据库第六章作业

发表本文章意为记录与分享 第6章作业.xls 题量: 25 满分: 100 一. 单选题(共25题) 1. (单选题)关系模式中,满足2NF的模式,( )。 A. 可能是1NFB. 必定是3NFC. 必定是1NFD. 以上都不正确 我的答案: C :…

MySQL的多表操作-外键约束

文章目录 外键约束介绍特点添加外键约束数据插入 删除外键约束 外键约束 介绍 MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表&#…

执行事务合伙人和法人区别是什么

1. 定义不同: 执行事务合伙人指负责经营和管理合伙企业的人,对外代表合伙企业进行业务活动,对内负责合伙企业的日常管理。 法人则是企业的法定代表人,代表企业参与民事活动,是企业的行政领导,对企业经济活动…

WebGL 世界坐标系和本地坐标系

目录 前言 ​编辑本地坐标系 世界坐标系 变换与坐标系 前言 在WebGL 从0到1绘制一个立方体_山楂树の的博客-CSDN博客中,我们创建并显示了第一个三维物体(一个立方体),示例程序开始变得像一个“真正”的三维程序了。我们亲…

C++数位算法:数字1的个数

题目 给定一个整数 n&#xff0c;计算所有小于等于 n 的非负整数中数字 1 出现的个数。 示例 1&#xff1a; 输入&#xff1a;n 13 输出&#xff1a;6 示例 2&#xff1a; 输入&#xff1a;n 0 输出&#xff1a;0 提示&#xff1a; 0 < n < 109 2023年1月版 class S…

2000-2023年省市县人工智能企业数量数据

2000-2023年省市县人工智能企业数量数据 1、时间&#xff1a;2000-2023年7月 2、指标&#xff1a;所属年度、所属省份、所属城市、所属区县、人工智能企业数量&#xff08;省人工智能企业数量、地级市人工智能企业数量、区县人工智能企业数量&#xff09; 3、来源&#xff1…

python接口自动化测试(六)-unittest-单个用例管理

前面五节主要介绍了环境搭建和requests库的使用&#xff0c;可以使用这些进行接口请求的发送。但是如何管理接口案例&#xff1f;返回结果如何自动校验&#xff1f;这些内容光靠上面五节是不行的&#xff0c;因此从本节开始我们引入python单元测试框架 unittest&#xff0c;用它…

用Java包com.sun.net.httpserver下面的类实现一个简单的http服务器demo

java的com.sun.net.httpserver包下的类提供了一个高层级的http服务器API&#xff0c;可以用来构建内嵌的http服务器。支持http和https。这些API提供了一个RFC 2616 (HTTP 1.1)和RFC 2818 (HTTP over TLS)的部分实现。 https://docs.oracle.com/en/java/javase/19/docs/api/jdk.…

C++对象模型(12)-- 构造函数语义学:构造函数

1、默认构造函数生成规则 编译器不一定会为类生成默认构造函数&#xff0c;但在下列情况下&#xff0c;编译器会生成默认构造函数。 &#xff08;1&#xff09;该类没有任何构造函数&#xff0c;但包含一个类类型的成员变量&#xff0c;且成员变量所属的类有默认构造函数。 …

基于antd实现动态修改节点的Tree组件

前言 之前遇到一个需求&#xff0c;可对于任意节点添加或删除子节点。首先技术栈是基于reactant design&#xff0c;ant提供了Tree组件&#xff0c;但都是根据固定的数据渲染出树结构&#xff0c;如果需要新增或删除节点&#xff0c;官网并未提供。 实现过程 新增节点 首先…

elementui中el-select和el-tree实现下拉树形多选功能

实现效果如下&#xff1a; 代码如下&#xff1a; html中 <el-col :lg"12"><el-form-item label"可用单位" prop"useOrgListTemp"><div class"departAll"><el-selectref"selectTree"v-model"valu…

BUUCTF题解之[极客大挑战 2019]Havefun 1

1.题目分析 使用浏览器开发者工具查看网页源码&#xff0c;查看疑似flag的代码。 &#xff08;特别是注释了的源码&#xff0c;一般是HTML,JS,PHP的源码&#xff09; 修改统一资源定位符URL访问服务器后端接口&#xff0c;拿到flag。 1.URL URL是统一资源定位符&#xff08;…

“torch.load“中出现的“Unexpected key(s) in state_dict“报错问题

问题&#xff1a; 解决&#xff1a; 添加strictFalse&#xff0c;允许加载过程中出现不匹配的键。但请注意,仍然需要确保模型中的主要参数能够正确加载&#xff0c;以确保模型的有效性。 model.load_state_dict(state_dict) # 改为&#xff1a; model.load_state_dict(state…

接口自动化测试之HttpRunner测试框架

引言 接口自动化测试的实现方案有很多&#xff0c;没有编程基础的可以使用 PostmanNewman 或 JmeterAnt 来实现&#xff0c;有编程基础的则可以结合自动化测试框架来实现。基于Python的测试框架有&#xff1a;Unittest、HttpRunner、Robot Framework、Pytest等&#xff0c;本文…

跨境电商系统商城源码定制开发的优势与需求

随着互联网的快速发展&#xff0c;跨境电商成为了全球贸易的重要方式之一。为了满足不同企业的需求&#xff0c;跨境电商系统商城源码定制开发应运而生。这种定制开发的方式可以帮助企业打造适合自己的电商系统&#xff0c;提供个性化的功能和服务&#xff0c;迎合不断变化的市…

报错解决——AttributeError: ‘OpenpyxlWriter‘ object has no attribute ‘save‘

完整报错 Traceback (most recent call last):File "track_half.py", line 249, in <module>main(opt,File "track_half.py", line 153, in mainEvaluator.save_summary(summary, os.path.join(result_root, summary_{}.xlsx.format(exp_name)))Fil…