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

python语言基础-5 进阶语法-5.2 装饰器-5.2.2 简单装饰器

声明:本内容非盈利性质,也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站,会尽量附上原文链接,并鼓励大家看原文。侵删。

5.2.2 简单装饰器

装饰器的形式就是一个闭包,下面是一个简单的定义并使用装饰器的例子。如下:

'''
def house():print('我是毛坯房……')
这是一个原函数,下面我们要自定义一个装饰器,并为这个原函数添加装饰器的效果。
'''# 定义一个装饰器
def decorate(func):  # 定义装饰器函数,它的参数是一个函数a = 100print('wrapper开始加载......')def wrapper():func()  # func()代表被装饰的原函数,使用中可根据需要放置其位置print('----刷漆')print('----铺地板', a)print('----做装潢')print('wrapper加载完成......')return wrapper  # 返回值是内部函数# 定义函数并使用装饰器
@decorate  # 装饰器在定义被装饰函数时使用,自定义装饰器的名称就是我们定义装饰器函数(闭包函数)时的函数名
def house():print('我是毛坯房……')# 调用函数,可以看出打印结果中带有装饰器的效果
house()# 打印函数名查看函数的特性
print(house)  # 输出结果为<function decorate.<locals>.wrapper at 0x0000029C7675D310>,打印house,但输出wrapper,是因为装饰器装返回值给了house

由上面的例子可以看出,装饰器有如下特点:

  • 装饰器是一个闭包;
  • 装饰器以函数为参数。

为什么在被装饰器装饰后,调用原函数会有装饰效果?我们仔细考虑一下装饰器的作用过程:

  1. 装饰器的效果被打印了(上面的例子中),说明装饰器被调用了;
  2. 打印函数名显示内存地址时出现了与装饰器内层函数相关的内容(上面例子中),说明函数的地址是指向装饰器内层函数的地址的;
  3. 因此,我们可以推测:当调用原函数时,装饰器内层函数会被返回给了被装饰函数,即被装饰后装饰器的内层函数就代表了被装饰函数。

即然装饰器的内层函数代表了被装饰函数,那么需要我们考虑一种情况:当被装饰函数有参数时,装饰器的内层函数需要不需要保持参数列表的对应(不一定是一致)?答案是肯定的。如下:

'''
被装饰函数有参数,而装饰器的内层函数没有参数时,运行会报错
'''
def decorate(func):  # 定义装饰器函数a = 100print('wrapper开始加载......')def wrapper():  # 原函数有参,此处没有参数func(8)  # func(x)相当于原函数的调用,直接写定一个参数print('----刷漆')print('----铺地板', a)print('----做装潢')print('wrapper加载完成......')return wrapper# 使用装饰器
@decorate
def house(n):print('我是毛坯房{}'.format(n))house(3)  # 定义的原函数有参数,调用时参数是不能为空的# 运行结果会报如下错误:TypeError: decorate.<locals>.wrapper() takes 0 positional arguments but 1 was given,这说明我们一定要给装饰器的内层函数设置参数'''
被装饰函数有参数,装饰器的内层函数也需要参数
'''
def decorate(func):  # 定义装饰器函数a = 100print('wrapper开始加载......')def wrapper(*x):  # 原函数有参,因此此处也要有参,可以是单参数x,也可以是可变参数 *xfunc(x)  # func(x)相当于原函数的调用,也要有参,可以是可变参数 *xprint('----刷漆')print('----铺地板', a)print('----做装潢{}'.format(x))print('wrapper加载完成......')return wrapper# 使用装饰器
@decorate
def house(n):print('我是毛坯房{}'.format(n))house(3)  # 定义的原函数有参数,调用时参数是不能为空的

相关文章:

python语言基础-5 进阶语法-5.2 装饰器-5.2.2 简单装饰器

声明&#xff1a;本内容非盈利性质&#xff0c;也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站&#xff0c;会尽量附上原文链接&#xff0c;并鼓励大家看原文。侵删。 5.2.2 简单装饰器 装饰器的形式就是一个闭包&#xff0c;下面是一个简单的定义并使用…...

TransFormer--解码器:带掩码的多头注意力层

TransFormer--解码器&#xff1a;带掩码的多头注意力层 以英法翻译任务为例&#xff0c;假设训练数据集样本如下表所示。 原句目标翻译I am goodJe vais bienGood morningBonjourThank you very muchMerci beaucoup 上表所示的数据集由两部分组成&#xff1a;原句和目标句。在…...

【ArcGIS微课1000例】0130:图层组详解与使用

文章目录 一、图层组概述二、创建图层组三、在图层组中管理图层四、对话框中图层组的列表一、图层组概述 图层组包含其他图层。图层组有助于对地图中相关类型的图层进行组织,并且可用于定义高级绘制选项。例如,假设在地图上有两个图层分别用于表示铁路和高速公路。您可将这些…...

Linux中配置ntp服务

NTP&#xff1a;是Network Time Protocol的缩写又 称网络时间协议&#xff0c;是用来使计算机时间同步化的一种协议&#xff0c;用来同步网络中各主机的时 间&#xff0c;在linux系统中早期使用ntp来实现&#xff0c;后来使用chrony来实现。Chrony 应用本身已经有 几年了&#…...

微服务day10-Redis面试篇

Redis主从 搭建主从集群 建立集群时主节点会生成同一的replicationID,交给各个从节点。 集群中的缓冲区是一个环型数组&#xff0c;即若从节点宕机时间过长&#xff0c;可能导致命令被覆盖。 主从集群优化 哨兵原理 哨兵是一个集群来确保哨兵不出现问题。 服务状态监控 选举…...

STL序列式容器之list

相较于vector的连续性空间&#xff0c;list相对比较复杂&#xff1b;list内部使用了双向环形链表的方式对数据进行存储&#xff1b;list在增加元素时&#xff0c;采用了精准的方式分配一片空间对数据及附加指针等信息进行存储&#xff1b; list节点定义如下 template<clas…...

docker:基于Dockerfile镜像制作完整案例

目录 摘要目录结构介绍起始目录package目录target目录sh目录init.sh脚本start.sh脚本stop.sh脚本restart.sh脚本 config目录 步骤1、编写dockerfilescript.sh脚本 2、构件镜像查看镜像 3、保存镜像到本地服务器4、复制镜像文件到指定目录&#xff0c;并执行init.sh脚本5、查看挂…...

微信小程序自定义顶部导航栏(适配各种机型)

效果图 1.pages.js&#xff0c;需要自定义导航栏的页面设置"navigationStyle": "custom" 2.App.vue,获取设备高度及胶囊位置 onLaunch: function () {// 系统信息const systemInfo uni.getSystemInfoSync()// 胶囊按钮位置信息const menuButtonInfo uni.…...

sslSocketFactory not supported on JDK 9+

clientBuilder.sslSocketFactory(SSLSocketFactory) not supported on JDK 9 at okhttp3.internal.platform.Jdk9Platform.trustManager(Jdk9Platform.kt:61) at okhttp3.OkHttpClient$Builder.sslSocketFactory(OkHttpClient.kt:751) at 1.升版本4.9.3以上 2、加个函数获取X…...

[Codesys]常用功能块应用分享-BMOV功能块功能介绍及其使用实例说明

官方说明 功能说明 参数 类型 功能 pbyDataSrcPOINTER TO BYTE指向源数组指针uiSizeUINT要移动数据的BYTE数pbyDataDesPOINTER TO BYTE指向目标数组指针 实例应用-ST IF SYSTEM_CLOCK.AlwaysTrue THENCASE iAutoState OF0: //读写完成信号在下次读写信号的上升沿或复位信号…...

大语言模型通用能力排行榜(2024年11月8日更新)

数据来源SuperCLUE 榜单数据为通用能力排行榜 排名 模型名称 机构 总分 理科 文科 Hard 使用方式 发布日期 - o1-preview OpenAI 75.85 86.07 76.6 64.89 API 2024年11月8日 - Claude 3.5 Sonnet&#xff08;20241022&#xff09; Anthropic 70.88 82.4…...

信息技术引领未来:大数据治理的实践与挑战

信息技术引领未来&#xff1a;大数据治理的实践与挑战 在信息技术日新月异的今天&#xff0c;大数据已成为企业和社会发展的重要驱动力。大数据治理&#xff0c;作为确保数据质量、安全性和合规性的关键环节&#xff0c;正面临着前所未有的实践挑战与机遇。本文将探讨信息技术…...

Git 分⽀规范 Git Flow 模型

前言 GitFlow 是一种流行的 Git 分支管理策略&#xff0c;由 Vincent Driessen 在 2010 年提出。它提供了一种结构化的方法来管理项目的开发、发布和维护&#xff0c;特别适合大型和复杂的项目。GitFlow 定义了一套明确的分支模型和工作流程&#xff0c;使得团队成员可以更有效…...

基于YOLOv8深度学习的公共卫生防护口罩佩戴检测系统(PyQt5界面+数据集+训练代码)

在全球公共卫生事件频发的背景下&#xff0c;防护口罩佩戴检测成为保障公众健康和控制病毒传播的重要手段之一。特别是在人员密集的公共场所&#xff0c;例如医院、学校、公共交通工具等地&#xff0c;口罩的正确佩戴对降低病毒传播风险、保护易感人群、遏制疫情扩散有着至关重…...

Nature Communications 基于触觉手套的深度学习驱动视触觉动态重建方案

在人形机器人操作领域&#xff0c;有一个极具价值的问题&#xff1a;鉴于操作数据在人形操作技能学习中的重要性&#xff0c;如何有效地从现实世界中获取操作数据的完整状态&#xff1f;如果可以&#xff0c;那考虑到人类庞大规模的人口和进行复杂操作的简单直观性与可扩展性&a…...

构建SSH僵尸网络

import argparse import paramiko# 定义一个名为Client的类&#xff0c;用于表示SSH客户端相关操作 class Client:# 类的初始化方法&#xff0c;接收主机地址、用户名和密码作为参数def __init__(self, host, user, password):self.host hostself.user userself.password pa…...

WPF中MVVM工具包 CommunityToolkit.Mvvm

CommunityToolkit.Mvvm&#xff0c;也称为MVVM工具包&#xff0c;是Microsoft Community Toolkit的一部分。它是一个轻量级但功能强大的MVVM&#xff08;Model-View-ViewModel&#xff09;库&#xff0c;旨在帮助开发者更容易地实现MVVM设计模式。 特点 独立于平台和运行时&a…...

学习空闲任务函数

一、user_StopEnterTask 停止 进入任务 /* Private includes -----------------------------------------------------------*/ //includes #include "user_TasksInit.h" #include "user_MPUCheckTask.h"#include "ui.h" #include "ui_Hom…...

Hyper-v中ubuntu与windows文件共享

Hyper-v中ubuntu与windows文件共享 前言相关链接第一步--第一个链接第二步--第二个链接测试与验证 前言 关于Hyper-V的共享我搞了好久&#xff0c;网上的很多教程太过冗余&#xff0c;我直接采用最简单的办法吧 相关链接 Hyper-V中Ubuntu 同windows系统共享文件夹-百度经验 …...

【软件工程】一篇入门UML建模图(类图)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;软件开发必练内功_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…...

Windows安卓子系统终极指南:从基础配置到专业开发全流程

Windows安卓子系统终极指南&#xff1a;从基础配置到专业开发全流程 【免费下载链接】WSA Developer-related issues and feature requests for Windows Subsystem for Android 项目地址: https://gitcode.com/gh_mirrors/ws/WSA 想要在Windows 11上无缝运行安卓应用吗&…...

深耕区域数字生态,智森传媒赋能本地中小企业破局增长

在本地生活流量红利消退、行业内卷加剧的当下&#xff0c;中小企业数字化转型已不是选择题&#xff0c;而是生存题。十堰智森网络传媒立足本土市场&#xff0c;以技术研发为根基&#xff0c;以区域获客为核心&#xff0c;以数字人直播为抓手&#xff0c;为中小企业搭建全链路数…...

基于LLM的多智能体协作框架:从原理到实践构建自主开发团队

1. 项目概述与核心价值最近在开源社区里&#xff0c;一个名为zxkane/autonomous-dev-team的项目引起了我的注意。乍一看这个标题&#xff0c;你可能会联想到科幻电影里的全自动机器人编程&#xff0c;或者是一些过于理想化的“AI接管开发”的噱头。但在我花时间深入研究和实践之…...

C语言-指针二

一. 指针的操作int main() {int a 10 , b 20, c 30;int *p NULL, *q NULL;p &a;//对指针变量p本身进行修改b *p;//*p为右值表示对变量a的读取*p 60;//*p为左值表示通过指向的内存空间对变量a的写入p &c;//p指向的内存空间发生变化b *p;//对c的读取操作*p 70…...

开源情报自动化工具OpenClaw:模块化设计与实战部署指南

1. 项目概述&#xff1a;从“Resolver-TNG/ogas-openclaw”看开源情报自动化最近在开源情报&#xff08;OSINT&#xff09;和自动化数据采集的圈子里&#xff0c;一个名为“ogas-openclaw”的项目引起了我的注意。这个项目托管在Resolver-TNG的组织下&#xff0c;名字本身就很有…...

公交查询|智能公交|公交线路查询|基于SprinBoot+vue智能公交系统(源码+数据库+文档)

公交查询|智能公交|公交线路查询系统 目录 基于SprinBootvue智能公交系统 一、前言 二、系统设计 三、系统功能设计 1用户模块实现 2管理员服务端模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介…...

别再只会用cv2.resize()了!手把手教你用Python复现最近邻和双线性插值(附完整代码)

从零实现图像缩放&#xff1a;深入理解最近邻与双线性插值的数学本质 当你在Jupyter Notebook里轻松敲下cv2.resize(img, (300,300))时&#xff0c;有没有想过这个看似简单的操作背后隐藏着怎样的数学魔法&#xff1f;今天我们将撕开OpenCV的封装外壳&#xff0c;用纯Python和N…...

构建个人AI记忆体:向量数据库与语义搜索实践指南

1. 项目概述&#xff1a;构建你的个人AI记忆体最近几年&#xff0c;AI助手越来越聪明&#xff0c;但总感觉它们“记性”不太好。你昨天刚和它聊过你家的猫叫“橘子”&#xff0c;今天再问它&#xff0c;它可能就忘了。或者&#xff0c;你让它帮你总结上周的工作周报&#xff0c…...

如何在Chrome浏览器中快速生成与扫描二维码:终极免费插件指南

如何在Chrome浏览器中快速生成与扫描二维码&#xff1a;终极免费插件指南 【免费下载链接】chrome-qrcode :zap: A Chrome plugin to Genrate QRCode of URL / Text, or Decode the QRcode in website. 一个Chrome浏览器插件&#xff0c;用于生成当前URL或者选中内容的二维码&a…...

APK安装器完整指南:在Windows上轻松安装安卓应用的终极方案

APK安装器完整指南&#xff1a;在Windows上轻松安装安卓应用的终极方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否想在Windows电脑上直接运行手机应用&…...