Python语法装饰器

news/2024/10/30 21:32:44/

参考:

  • 【【python】装饰器超详细教学,用尽毕生所学给你解释清楚,以后再也不迷茫了!-哔哩哔哩】 https://b23.tv/Y6Ss8cN
  • 【Python小技巧:装饰器(Decorator)-哔哩哔哩】 https://b23.tv/hacMmem

x.1 Python中的Abstract Decorator抽象装饰器

python中任何东西都是object对象,而任何object都有一个CALL_FUNCTION,即当你使用1()其实会调用1CALL_FUNCTION。这个和类的实例化对象transform()不一样,他是调用__call__这个magic method。常见的built-in function和magic method对应关系。

__len__是magic method,而len()是built-in function。

请添加图片描述

所以function也可以作为输入传入

def double(x):return x * 2def triple(x):return x * 3def calc_number(func, x):print(func(x))calc_number(double, 3)
calc_number(triple, 3)

同样函数的返回值也可以是一个函数

def get_multiple_func(n):def multiple(x):return n * xreturn multipledouble = get_multiple_func(2)   # <=> double = multiple, while double(3)=multiple(3)
triple = get_multiple_func(3)print(double(3))
print(triple(3))

一个极简的Abstract decorator如下,decorator本质上是一个输入输出都是函数的函数

# 一个极简的Abstract decorator如下,decorator是一个输入输出都是函数的函数:
def dec(f):pass@dec
def double(x):return x * 2# 等价于如下:
double = dec(double)

x.2 Python中的Base Decorator正常装饰器

一个正常的base decorator如下

# 一个正常的base decorator如下::如我们要完成计算时间的功能
import time
def display_time(func):def wrapper():t1 = time.time()func()t2 = time.time()print(t2 - t1)return wrapper@display_time
def count():count = 0for i in range(1000):count += 1count()

增加返回值功能

# 增加返回值功能
def display_time_return(func):def wrapper():t1 = time.time()result = func()t2 = time.time()print(t2 - t1)return resultreturn wrapper@display_time_return
def count_return():count = 0for i in range(1000):count += 1return countresult = count_return()
print(result)

增加返回值和传递参数功能

# 增加返回值和传递参数功能
def display_time_return_param(func):def wrapper(*args, **kwargs):t1 = time.time()result = func(*args, **kwargs)t2 = time.time()print(t2 - t1)return resultreturn wrapper@display_time_return_param
def count_return_param(count_num=10000):count = 0for i in range(count_num):count += 1return countresult = count_return_param(count_num=200000)
print(result)

http://www.ppmy.cn/news/70212.html

相关文章

142. 环形链表 II Python

文章目录 一、题目描述示例 1示例 2示例 3 二、代码三、解题思路 一、题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#x…

基于JSP技术的猎头公司管理软件的设计和实现——内部事务部分(源代码+论文)

随着信息科学技术的飞速发展&#xff0c;人们逐渐意识到对信息管理软件的运用可以使日常工作更加方便、快捷和高效。论文详细论述了猎头公司管理软件内部事务部分的开发设计过程。软件采用JSP开发技术&#xff0c;Tomcat作容器&#xff0c; SQL Server 2000作数据库管理系统&am…

MyBatis操作数据库实现增删改查

创建数据库 语句要分别执行 CREATE DATABASE mybatis;USE mybatis;CREATE TABLE user(id INT(10) NOT NULL PRIMARY KEY,name VARCHAR(20) DEFAULT NULL,INSERT INTO user(id,name,pwd) VALUES (1,张三,123456), (2,李四,121212), (3,王五,1314520) 搭配环境 1、在pojo包创…

libevent高并发网络编程 - 02_libevent缓冲IO之bufferevent

文章目录 1. 为什么需要缓冲区&#xff1f;2. 水位3. bufferevent常用API3.1 evconnlistener_new_bind()3.2 evconnlistener_free()3.3 bufferevent_socket_new()3.4 bufferevent_enable()3.5 bufferevent_set_timeouts()3.6 bufferevent_setcb()3.7 bufferevent_setwatermark(…

Python快速批量修改图片尺寸

之前我们写过快速批量获取图片的大小&#xff0c;该文章链接在这里&#xff1a;Python每日一个知识点9----批量输出图片尺寸 今天我们分享一个快速批量修改图片尺寸的小脚本&#xff0c;我们一下看一下 先看一下目录结构&#xff1a; 文件夹&#xff1a;【原始图片】&#xf…

django ORM框架(操作数据库)第一章

目录 一、ORM框架介绍 二、Django配置数据库 2.1 在本地mysql中创建数据库与用户 2.2 django 连接本地mysql(安装mysqlclient及依赖环境&#xff09;mac安装 三、模型类 3.1、创建模型类&生成迁移脚本&执行迁移脚本 3.2 类属性&表字段介绍 3.2.1 models.Ch…

Python每日一练(20230514) 不同路径 I\II\III UniquePaths

目录 1. 不同路径 I Unique Paths 1 2. 不同路径 II Unique Paths 2 3. 不同路径 III Unique Paths 3 &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 不同路径 I Unique Paths 1 一个…

PyCaret:低代码自动化的机器学习工具

PyCaret简介 随着ChatGPT和AI画图的大火&#xff0c;机器学习作为实现人工智能的底层技术被大众越来越多的认知&#xff0c;基于机器学习的产品也越来越多。传统的机器学习实现方法需要较强的编程能力和数据科学基础&#xff0c;这使得想零基础尝试机器学习变得非常困难。 机器…