当前位置: 首页 > news >正文

python基础--修饰器

修饰器(语法糖)

在python中函数实际上就是一个对象

def outer(x):def inner(y):return x + yreturn innerprint(outer(6)(5))
def double(x):return x * 2
def triple(x):return x * 3def calc_number(func, x):print(func(x))calc_number(double, 3)
calc_number(triple, 3)

函数自己也可以作为返回值

修饰器

新的代码需要在一个函数的前面或者后面添加一段代码

def dec(f):pass@dec
def double(x):return x * 2#等价于
double = dec(double)

会把下面的函数传给这一个装饰器函数, 装饰器需要返回新的函数, 这一个返回值会成为新的下面的函数

import time def timeit(f):def wrapper(x):start = time.time()ret = f(x)print(time.time() - start)return retreturn wrapper@timeit
def myfunction(x):time.sleep(x)# myfunction(1)@timeit
def other_func(x):return x*2print(other_func(2))

带参数

import time
def timeit(f):def wrapper(*args, **kwargs):			#传入的参数不限制start = time.time()ret = f(*args, **kwargs)			# 会把传入的函数在这里执行print(time.time() - start)return retreturn wrapper@timeit
def myfunc(x):time.sleep(x)@timeit
def add(x, y):return x+yprint(add(2, 3))

接下来就讲装饰器,其实装饰器就是一个闭包,装饰器是闭包的一种应用。什么是装饰器呢,简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。使用时,再需要的函数前加上@demo即可。

import timedef timeit(repeats):def decorator(func):def wrapper(*args, **kwargs):total_time = 0for _ in range(repeats):		# 1000决定这一个函数的执行次数start_time = time.time()result = func(*args, **kwargs)	# 获取一个resultend_time = time.time()total_time += end_time - start_timeaverage_time = total_time / repeatsprint(f"Average execution time: {average_time} seconds")return resultreturn wrapperreturn decorator@timeit(1000)
def double(x):return x * 2# Equivalent to:
# double = timeit(1000)(double)# Test the function
print(double(2))

前面的返回的是一个函数(这一个函数会被作为修饰器), 返回的这一个修饰器调用double再返回一个实际可以执行的函数

修饰器闭包

import time
def timeit(interation):def inner(f):def wrapper(*args, **kwargs):start = time.time()for _ in range(interation):print("1")ret = f(*args, **kwargs)ret = f(*args, **kwargs)print(time.time() - start)return retreturn wrapperreturn inner@timeit(10)
def double(x):return x*2print(double(2))

等价于

inner = timeit(10)  # 返回一个修饰器
double = inner(double)	# 使用这一个修饰器进行修饰
import timedef inner(f):def wrapper(*args, **kwargs):start = time.time()for _ in range(10):print("1")ret = f(*args, **kwargs)ret = f(*args, **kwargs)print(time.time() - start)return retreturn wrapperreturn inner@inner
def double(x):return x*2

装饰器实际装饰的时间是在python解析到这一个函数的时候, 实际执行函数的时候不用再次装饰

实际这一个装饰就是一个闭包, 不同的是这一个闭包对它的参数的使用, 修饰器把这一个参数作为可调用的对象使用

多次修饰

def makeBlod(fn):def wrapped():return "<b>" + fn() + "</b>"return wrappeddef makeItalic(fn):def wrapped():return "<i>" + fn() + "</i>"return wrapped@makeBlod
@makeItalic
def hello():return "hello world"print(hello())
PS E:\JHY\python\2024-4-22> python -u "e:\JHY\python\2024-4-22\main.py"
<b><i>hello world</i></b>

装饰的时候会先调用离得近的那一个

类为装饰器

import time
class Test(object):def __init__(self, func):print("初始化")print("func name is %s" % func.__name__)self.__func = funcdef __call__(self):print("装饰器中的功能")self.__func()@Test
def test():print("test函数")test()

这一个实际调用的时候是test = Test(test), 创建了一个对象

import time
class Test(object):def __init__(self, num):print("初始化")self.__num = numdef __call__(self, func):print("装饰器中的功能")def inner():print("inner函数, num = %d" % self.__num)func()return inner@Test(10)
def test():print("test函数")test()

这里是先获取一个对象, 这一个对象的执行是一个修饰器

class Test(object):def __init__(self, num):print("初始化")self.__num = numdef __call__(self, func):print("装饰器中的功能")self.__func = funcreturn self.call_old_funcdef call_old_func(self):print("inner函数")self.__func()

相关文章:

python基础--修饰器

修饰器(语法糖) 在python中函数实际上就是一个对象 def outer(x):def inner(y):return x yreturn innerprint(outer(6)(5))def double(x):return x * 2 def triple(x):return x * 3def calc_number(func, x):print(func(x))calc_number(double, 3) calc_number(triple, 3)函…...

6. Z 字形变换

题目描述 给你一个字符串s和行数numRows&#xff0c;把s字符串按照z字形重新排列。 再从左往右进行读取&#xff0c;返回读取之后的字符串。 本题是找规律&#xff0c;但是没有找出来 解题思路 要想解出来该题&#xff0c;在进行z字变换的时候&#xff0c;我们把字符串的下…...

shell常用文件处理命令

1. 解压 1.1 tar 和 gz 文件 如果你有一个 .tar 文件,你可以使用以下命令来解压: tar -xvf your_file.tar在这个命令中,-x 表示解压缩,-v 表示详细输出(可选),-f 后面跟着要解压的文件名。 如果你的 .tar 文件同时被 gzip 压缩了(即 .tar.gz 文件),你可以使用以下…...

从Paint 3D入门glTF

Paint 3D Microsoft Paint 3D是微软的一款图像编辑软件&#xff0c;它是传统的Microsoft Paint程序的升级版。 这个新版本的Paint专注于三维设计和创作&#xff0c;使用户可以使用简单的工具创建和编辑三维模型。 Microsoft Paint 3D具有直观的界面和易于使用的工具&#xff0…...

数据库(MySQL)—— DQL语句(基本查询和条件查询)

数据库&#xff08;MySQL&#xff09;—— DQL语句&#xff08;基本查询和条件查询&#xff09; 什么是DQL语句基本查询查询多个字段字段设置别名去除重复记录 条件查询语法条件 我们今天进入MySQL的DQL语句的学习&#xff1a; 什么是DQL语句 MySQL中的DQL&#xff08;Data Q…...

如何根据索引删除数组中的元素,并保证删除的正确性

使用 splice() 方法来删除这些索引处的数据 var array [1, 2, 3, 4, 5]; var indexesToDelete [1, 3]; // 需要删除的索引// 将需要删除的索引按照从大到小的顺序排序&#xff0c;以避免删除元素后索引发生变化 indexesToDelete.sort((a, b) > b - a);// 遍历需要删除的索…...

Shell编程规范与变量

目录 一、shell脚本概述 Shell脚本的概念 Shel脚本应用场景 1、shell的作用 2、shell编程规范 Shell脚本的编写 Shell脚本的运行 3、重定向与管道 交互式硬件设备 重定向操作 管道操作符号"|" 二、shell脚本变量 变量的作用 变量的类型 1、自定义变量…...

武汉星起航:策略升级,亚马逊平台销售额持续增长显实力

武汉星起航电子商务有限公司&#xff0c;一家致力于跨境电商领域的企业&#xff0c;于2023年10月30日在上海股权托管交易中心成功挂牌展示&#xff0c;这一里程碑事件标志着公司正式踏入资本市场&#xff0c;开启了新的发展篇章。公司董事长张振邦在接受【第一财经】采访时表示…...

循环链表 -- c语言实现

#pragma once // 带头双向循环链表增删查改实现 #include<stdlib.h> #include<stdio.h> #include<assert.h>typedef int LTDataType;typedef struct ListNode {LTDataType data;struct ListNode* next;struct ListNode* prev; }ListNode;//双链表申请一个新节…...

如何使git提交的时候忽略一些特殊文件?

认识.gitignore文件 在生成远程仓库的时候我们会看到这样一个选项&#xff1a; 这个.gitignore文件有啥用呢&#xff1f; .gotignore文件是Git版本控制系统中的一个特殊文件。用来指定哪些文件或者目录不被Git追踪或者提交到版本库中。也就意味着&#xff0c;如果我们有一些文…...

如何保证Redis双写一致性?

目录 数据不一致问题 数据库和缓存不一致解决方案 1. 先更新缓存&#xff0c;再更新数据 该方案数据不一致的原因 2. 先更新数据库&#xff0c;再更新缓存 3. 先删除缓存&#xff0c;再更新数据库 延时双删 4. 先更新数据库&#xff0c;再删除缓存 该方案数据不一致的…...

HarmonyOS实战开发-如何实现查询当前城市实时天气功能

先来看一下效果 本项目界面搭建基于ArkUI中TS扩展的声明式开发范式&#xff0c; 数据接口是和风&#xff08;天气预报&#xff09;&#xff0c; 使用ArkUI自带的网络请求调用接口。 我想要实现的一个功能是&#xff0c;查询当前城市的实时天气&#xff0c; 目前已实现的功能…...

(三)JSP教程——JSP动作标签

JSP动作标签 用户可以使用JSP动作标签向当前输出流输出数据&#xff0c;进行页面定向&#xff0c;也可以通过动作标签使用、修改和创建对象。 <jsp:include>标签 <jsp:include>标签将同一个Web应用中静态或动态资源包含到当前页面中。资源可以是HTML、JSP页面和文…...

centos7安装真的Redmine-5.1.2+ruby-3.0.0

下载redmine-5.1.2.tar.gz&#xff0c;上传到/usr/local/目录下 cd /usr/local/ tar -zxf redmine-5.1.2.tar.gz cd redmine-5.1.2 cp config/database.yml.example config/database.yml 配置数据连接 #编辑配置文件 vi config/database.yml #修改后的内容如下 product…...

方法的重写

方法的重写 概念&#xff1a;子类继承父类之后&#xff0c;就拥有了符合权限的父类的属性和方法&#xff0c;但是当父类的方法不符合子类的要求的时候&#xff0c;子类也可以重新的书写自己想要的方法。所以&#xff0c;方法的重写&#xff0c;即子类继承父类的方法后&#xf…...

Terraform局部值

Terraform输入变量用于从外部传递值到Terraform模块内部进行使用&#xff0c;如果把Terraform代码看作是一个函数的话&#xff0c;Terraform输入变量就是函数的输入参数。 Terraform局部值则用于在Terraform模块内部定义反复使用的常量值或表达式&#xff0c;如果把Terraform代…...

vue+element-ui实现横向长箭头,横向线上下可自定义文字(使用after伪元素实现箭头)

项目场景&#xff1a; 需要实现一个长箭头&#xff0c;横向线上下可自定义文字 代码描述 <div><span class"data-model">{{ //上方文字}}</span><el-divider class"q"> </el-divider>//分隔线<span class"data-mod…...

性能监控之prometheus+grafana搭建

前言 Prometheus和Grafana是两个流行的开源工具&#xff0c;用于监控和可视化系统和应用程序的性能指标。它们通常一起使用&#xff0c;提供了强大的监控和数据可视化功能。 Prometheus Prometheus是一种开源的系统监控和警报工具包。它最初由SoundCloud开发&#xff0c;并于…...

25-ESP32-S3 内置的真随机数发生器(RNG)

ESP32-S3 内置的真随机数发生器&#xff08;RNG&#xff09;&#x1f60e; 引言 &#x1f4da; 在许多应用中&#xff0c;随机数发生器&#xff08;RNG&#xff09;是必不可少的。无论是在密码学&#x1f512;、游戏&#x1f3ae;、模拟&#x1f9ea;或其他领域&#xff0c;随…...

万兆以太网MAC设计(12)万兆UDP协议栈上板与主机网卡通信

文章目录 一、设置IP以及MAC二、上板效果2.1、板卡与主机数据回环测试2.2、板卡满带宽发送数据 一、设置IP以及MAC 顶层模块设置源MAC地址 module XC7Z100_Top#(parameter P_SRC_MAC 48h01_02_03_04_05_06,parameter P_DST_MAC 48hff_ff_ff_ff_ff_ff )(input …...

Windows 环境 OpenClaw 部署详解|从安装到使用全流程

OpenClaw&#xff08;小龙虾&#xff09;Windows 一键部署教程&#xff5c;10 分钟搭建自动化数字员工 前言 OpenClaw&#xff08;俗称小龙虾&#xff09;是 2026 年热门的开源 AI 智能体&#xff0c;GitHub 星标突破 28 万&#xff0c;主打本地运行、低门槛、自动化执行。本…...

剪流AI事业大使是不是割韭菜?深度解析其真实运作细节与收益模型

近年来&#xff0c;“AI事业大使”成为一个热门话题&#xff0c;尤其是剪流AI推出的相关计划&#xff0c;引发了广泛讨论。其中&#xff0c;“AI事业大使是不是割韭菜”是许多观望者心中的核心疑问。本文将基于其公开的运作细节与权益体系&#xff0c;进行客观、深度的解析&…...

uniapp地图组件map+nvue实战:从标点聚合到交互优化全解析

1. 为什么选择uniapp的map组件nvue开发地图应用 最近在做一个店铺地图功能时&#xff0c;我遇到了一个很典型的问题&#xff1a;在普通vue页面中使用map组件时&#xff0c;那些浮动在地图上的按钮、弹窗总是被地图遮挡。这个问题困扰了我整整两天&#xff0c;直到尝试了nvue方案…...

2026年电钢琴避坑指南|高性价比品牌型号推荐,新手必看!

电钢琴选购核心要点&#xff08;快速避坑&#xff09; 在推荐具体机型前&#xff0c;先明确4个选购关键指标&#xff0c;确保不踩坑&#xff1a; 1.键盘&#xff1a;必须88键逐级配重重锤键盘&#xff0c;避免毁手型。 2.复音数:至少128复音&#xff08;避免弹奏复杂曲目时丢…...

HPM6750 RISC-V高性能MCU开发实战:从双核应用到图形加速

1. 项目概述与核心价值最近几年&#xff0c;RISC-V架构在嵌入式领域的声量越来越大&#xff0c;从最初的学术研究到如今在工业控制、边缘计算等场景的落地&#xff0c;生态的成熟度肉眼可见。作为一名长期混迹在嵌入式开发一线的工程师&#xff0c;我对于新架构、新平台总是抱有…...

2025届必备的五大AI辅助论文助手推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在当下人工智能范畴里身为重要参与者的DeepSeek&#xff0c;它所产出的论文常常展现出严谨的…...

【免费下载】 Maven 3.8.5 压缩包下载【maven下载安装与配置】

Maven 3.8.5 压缩包下载 简介 本仓库提供 Maven 3.8.5 版本的压缩包下载。Maven 是一个强大的项目管理和构建自动化工具&#xff0c;广泛应用于 Java 项目的开发中。 资源文件 文件名: maven3.8.5压缩包描述: Maven 3.8.5 版本的压缩包 下载链接 请点击以下链接下载 Mave…...

告别HAL库:用GD32标准库为RT-Thread打造轻量级驱动(以F4系列为例)

告别HAL库&#xff1a;用GD32标准库为RT-Thread打造轻量级驱动&#xff08;以F4系列为例&#xff09; 在嵌入式开发领域&#xff0c;HAL库因其跨平台兼容性和易用性广受欢迎&#xff0c;但对于追求极致性能和精简代码的开发者而言&#xff0c;标准库往往能带来更直接的硬件控制…...

RuoYi-Vue-Plus多租户实现原理:数据隔离与权限控制的终极指南 [特殊字符]

RuoYi-Vue-Plus多租户实现原理&#xff1a;数据隔离与权限控制的终极指南 &#x1f3e2; 【免费下载链接】RuoYi-Vue-Plus 基于RuoYi-Vue集成 LombokMybatis-PlusUndertowknife4jHutoolFeign 重写所有原生业务 定期与RuoYi-Vue同步 项目地址: https://gitcode.com/GitHub_Tre…...

DIY红外遥控电视关机器:从ATTINY85到晶体管驱动的硬件实践

1. 项目概述&#xff1a;从“关不掉”的烦恼到“一键清静”的实践不知道你有没有过这样的经历&#xff1a;在餐厅吃饭&#xff0c;墙上挂着的电视正播放着吵闹的广告&#xff1b;在候车室&#xff0c;多台电视同时播放着不同的节目&#xff0c;让人心烦意乱。你只想安安静静地待…...