python进阶:装饰器一系列高级使用方式记录:常规方式、带参数装饰器、类装饰器、类内定义装饰器并传递self参数等

文章目录

    • 概要
    • 一、函数定义装饰器(装饰器不带参数)
    • 二、函数定义装饰器(装饰器带参数)
    • 三、装饰器装饰同一个类里的函数
    • 四、类装饰器
    • 五、装饰器 + 描述符 应用于class

概要

装饰器来自decorator的直译。什么叫装饰,就是装点、提供一些额外的功能;
装饰器本质上是一个Python函数(其实就是闭包),它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.

例如

经典的应用有插入日志、增加计时逻辑来检测性能、加入事务处理等

一、函数定义装饰器(装饰器不带参数)

def decorator(obj):def wrapper(*args,**kwargs):'''函数里面可以操作自己想加入的功能;加上*args,**kwargs两个参数,即表示:无论被修饰的函数/类有几个参数、什么类型,都可以用该装饰器装饰,如果,没有写这两个参数,那就必须被装饰的函数/类有几个参数,装饰器就写死为几个参数;就达不到想要的效果'''print("执行装饰器")res=obj(*args,**kwargs)return resreturn wrapper#装饰器可装饰函数:
@decorator
def add(x,y):return x+y

二、函数定义装饰器(装饰器带参数)

# 举例两个变量
user = 'admin'
pwd = 'admin123'# 装饰器包含3层,最外层接收装饰器参数auth_type,第二层outter,接收装饰的函数func,其余与装饰器无异
def auth(auth_type):def outter(func):def wrapper(*args, **kwargs):if auth_type == 'local':username = input("Enter your username: ").strip()password = input("Enter your password: ").strip()if user == username and pwd == password:print("Access granted")else:print("Access denied")else:print('不用验证')return func()return wrapperreturn outter# 一般的装饰器不带括号与参数,带参数时一般逻辑更为复杂,如:装饰器中需要根据参数不同,走不同逻辑
@auth(auth_type='local1')
def index():print('welcome to the index page')return 'index'

三、装饰器装饰同一个类里的函数

提示:from functools import wraps

from functools import wrapsclass Test(object):def __init__(self):self.reset = Trueself.flag = True# 在类里定义一个装饰器def info(func):@wraps(func)def wrapper(self, *args, **kwargs):print('log_type: info'.center(50, '-'))if self.reset:print('Reset is Ture, change flag...')self.flag = Falsereturn func(self, *args, **kwargs)return wrapper@infodef speak(self, text):print(f'speak: {text}')if __name__ == '__main__':t = Test()t.speak('hello world')print(t.flag)

四、类装饰器

提示:这里可以添加总结


class Test:def __init__(self, func):self.func = funcdef __call__(self, *args, **kwargs):print('函数__call__被调用了'.center(50, '-'))return self.func(*args, **kwargs)@Test
def speak(text):print(f'speak: {text}')if __name__ == '__main__':speak('hello world')

五、装饰器 + 描述符 应用于class

(重)python:装饰器 + 描述符 应用于class

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

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

相关文章

❤ leetCode简易题1-两数之和、简易2--回文数判断、简易14-最长公共前缀

❤ leetCode简易题1-两数之和、简易题14- 最长公共前缀 1、简易1-两数之和 ① 题目要求 数字A B target,以target为求和结果,找出数组中符合的A、B数字下标。 第一次做的时候完全脑子一片蒙,随后认真看了看题目发现是发现找符合target和…

【OceanBase】v4.2.1 集群命令汇总

查看集群信息 # 查看所有集群 obd cluster list# 启动集群ob3cluster obd cluster start ob3cluster# 停止集群 obd cluster stop ob3cluster登录数据库 # root用户的sys租户登录数据库 obclient -hxxx.xxx.xxx.xxx -uxxx:sys:root -P2883 -pxxxxxx -c -A -DOceanbaseNFS 配置…

了解一波经典的 I/O 模型

最近读了波网络 I/O 相关的文章,做下总结、摘录。(未完) 经典 I/O 模型 {% checkbox red checked, 阻塞式 I/O(blocking I/O) %}{% checkbox red checked, 非阻塞式 I/O(non-blocking I/O) %}…

Weblogic,静默安装!

安装JDK 第一步 安装软件 首先,将下载好的JDK文件放到/root目录中。 切换到 /usr/lib目录下 cd /usr/lib 新建jdk目录 sudo mkdir jdk 解压安装包 tar zxvf jdk-8u202-linux-x64.tar.gz -C /usr/lib/jdk/ 第二步 配置java环境变量 这里是将环境变量配置在e…

docker可视化界面 - portainer安装

目录 一、官方安装说明 二、安装portainer 2.1拉取镜像 2.2运行portainer容器 2.3登录和使用portainer 一、官方安装说明: Install PortainerChoose to install Portainer Business Edition or Portainer Community Edition.https://www.portainer.io/install…

【LAMMPS学习】三、构建LAMMPS(8)构建 LAMMPS 文档

3. 构建 LAMMPS 3.8.构建 LAMMPS 文档 根据您获取 LAMMPS 的方式以及您是否自己构建了手册,该目录有许多子目录和文件。这是一个包含描述的列表: README # brief info about the documentation src # content files for LAMM…

C# LINQ笔记

C# LINQ笔记 from子句 foreach语句命令式指定了按顺序一个个访问集合中的项。from子句只是声明式地规定集合中的每个项都要访问,并没有指定顺序。foreach在遇到代码时就执行其主体。from子句什么也不执行,只有在遇到访问查询变量的语句时才会执行。 u…

Unbtun环境切换

之前的环境都是下载到系统环境里面的,后面安装了anaconda发现切换不到系统环境里面了,通过查找资料可以发现: ubuntu的python可分为三大类: ubuntu自带的系统python环境 一般安装在/usr/bin/中python2和python3可以共存 anaconda…

[Qt学习笔记]Qt实现自定义控件SwitchButton开关按钮

1、功能介绍 在项目UI中使用较多的打开/关闭的开关按钮,一般都是找图片去做效果,比如说如下的图像来表征打开或关闭。 如果想要控件有打开/关闭的动画效果或比较好的视觉效果,这里就可以使用自定义控件,使用Painter来绘制控件。软…

JavaScript的学习笔记

<script src"index.js" defer></script>&#xff0c;defer的作用是延迟加载index.js文件 定义变量 变量的类型分为两大类&#xff1a;基本类型和复合类型 JavaScript是一种弱类型语言&#xff0c;所以没有强类型语言所具有的int,float,char等等&#x…

阿里云linux服务器数据盘待初始化

如果您的阿里云Linux服务器数据盘已经购买但未进行初始化和格式化&#xff0c;您可以按照以下步骤进行操作&#xff1a; 查看数据盘信息&#xff1a; 使用fdisk -l命令查看当前所有磁盘的信息&#xff0c;识别未初始化的数据盘设备名称&#xff0c;如/dev/xvdb。分区数据盘&am…

Spring 实现 OAuth2 授权之解决方案

Spring Security OAuth2 - 已经废弃的项目 早期的Spring 使用 Spring Security OAuth2 实现 OAuth 2.0 的认证服务器和资源服务器。OAuth2是一个授权框架,它允许第三方应用获取有限的访问权限,而无需获取用户的账号和密码等敏感信息。通过这种方式,OAuth2协议实现了安全的用…

java语言实现树莓派4b下的超远程高精度电子秤

通常情况下,Java语言基于jvm虚拟机,垃圾回收,代码优化等机制,无法直接通过Java语言来操控硬件,获取传感器数据,本文做个折中,通过编写c语言代码,编译为.so文件,Java使用jni调用.so文件的方式,springboot操作Java方法,来编写一套超远程高精度电子秤的代码。总成本:2…

VScode通过ssh连接github

通过ssh连接github 1.生成公钥和私钥2.设置config文件3.配置ssh免密登录4.远程仓库初始化 1.生成公钥和私钥 首先选择一个文件夹&#xff0c;右击 git bash here&#xff0c;在命令行输入命令&#xff0c;按下三次回车生成一个**.ssh文件夹**&#xff0c;一般在用户的user根目…

AI浪潮下,新闻媒体的新变革与记者职业的未来发展

中国媒体经历了从口口相传到报纸、再到电视&#xff0c;最后到互联网自媒体的演变过程。传统报业在新媒体冲击下面临着存亡的挑战。 中国媒体的演变概括如下&#xff1a; 19世纪初&#xff1a;主要依靠口口相传和阅读报纸获取信息&#xff1b;20世纪&#xff1a;电视逐渐取代报…

MyBatis:查询与连接池

一、查询 1、多表查询 尽量避免使用多表查询&#xff0c;尤其是对性能要求较高的项目。因为多表查询必然会导致性能变低。 例如&#xff1a;select *from ta运行需要10ms&#xff0c;select *from tb 运行也需要10s。但是&#xff0c;select *from ta left join tb on ta.xx…

zabbix监控vmware esxi

一、zabbix服务端配置 修改zabbix_server.conf配置文件 vim /etc/zabbix/zabbix_server.conf #######zabbix_server.conf底部第二行开始添加下面配置######## StartVMwareCollectors5 #StartVMwareCollectors - 预先启动Vmware collector收集器实例的数量。此值取决于要监控的…

android13实现切换导航模式功能

支持android13以上系统&#xff0c;需要系统签名。 public class NavigationHelper {/*** 设置导航模式** param context* param mode GESTURAL&#xff1a;手势 TWOBUTTON&#xff1a;二按钮 THREEBUTTON&#xff1a;三按钮*/public static void setNavigationMode(Contex…

GEE显示研究区sentinel-2每年可用影像

第一次使用GEE&#xff0c;用了别人的代码&#xff0c;想查看每年影像可用数量&#xff0c;但是老是报错&#xff0c;说是null geometry&#xff0c;之前我是用GAMMA软件导出的kml文件&#xff0c;后面在arcgis自己勾画了sho文件&#xff0c;线类型&#xff0c;然后我就在想会不…

android各种软件下载

Android Studio 历史版本下载地址&#xff1a;https://developer.android.google.cn/studio/archive 拉到网页底部&#xff0c;点击 I agree to the terms 按钮 buildTools历史版本下载地址&#xff1a;https://androidsdkmanager.azurewebsites.net/build_tools.html