python类装饰器基础

1 python类装饰器基础

类装饰器是管理类的一种方式,不是包装单个函数或方法,而是用装饰器的额外逻辑,来包装实例的构建和调用,从而实现对主体类的扩展。

主体类被装饰后,通过主体类创建实例对象时,自动调用装饰器返回的包装器函数,而包装器函数内部会自动调用原来的主体类。

1.1 定义类装饰器

用法

def cls_decorator(cls):passreturn aCallable

描述

cls_decorator:装饰器函数;

cls:类入参

aCallable:可调用对象

类装饰器函数接收一个类,并且返回可调用对象,赋值给原类名。

1.2 类装饰器装饰类

用法

@cls_decorator
class AClass:pass
ac=AClass(8)

等价于

class AClass:pass
AClass=cls_decorator(AClass)
ac=AClass(8)

描述

@cls_decoratro:@类装饰器函数,下一行接class 主体类;

class AClass:定义主体类;

类装饰器用来装饰类。

执行过程:

@cls_decoraotr:python文件被加载时,@cls_decorator自动调用cls_decorator(AClass)装饰器函数,并且将下一行class定义的类对象AClass作为入参,装饰器返回可调用对象,赋值给类变量AClass。

aCallable:可调用对象,可以是原类,或者新类。

AClass:被重新赋值为可调用对象。

AClass(8):相当于调用可调用对象aCallable(8),而aCallable会将相关操作,给到入参接收到的原类AClass进行操作。

最终,装饰器实现了对主体类的扩展,而且不修改主体类的代码逻辑,不改变主体类的调用方式,即可执行装饰器扩展的额外逻辑。

1.3 类装饰器执行

示例

>>> def cls_decorator(cls):print('cls=',cls)print('clsid=',id(cls))print('cls_decorator 被调用返回原类')return cls>>> @cls_decorator
class TestClsDeco:print('TestClsDeco 被调用')# TestClsDeco 先被执行      
TestClsDeco 被调用
# cls_decorator 后被执行
cls= <class '__main__.TestClsDeco'>
clsid= 2624479393088
cls_decorator 被调用返回原类
>>> id(TestClsDeco)
# id 相同, cls 送给 cls_decorator的入参
2624479393088

描述

先执行主体类,再调用类装饰器,并且将主体类传给装饰器。

1.4 装饰器返回原类

用法

def cls_decorator(cls):# 添加修改原类cls的行为return cls # 返回原类cls

描述

类装饰器函数接收一个原类cls,装饰器内部添加修改原类的行为,并且返回原类,从而实现对原类的定制-装饰。

示例

>>> def cls_decorator(cls):print('cls_decorator 被调用返回原类')print('原类添加属性 name')cls.name='梯阅线条'return cls>>> @cls_decorator
class TestClsDeco:print('TestClsDeco 被调用')def __init__(self,url):self.url=urlTestClsDeco 被调用
cls_decorator 被调用返回原类
原类添加属性 name
>>> tcd=TestClsDeco('tyxt.work')
>>> tcd.name
'梯阅线条'
>>> tcd.url
'tyxt.work'

1.5 返回类包装器

用法

def cls_decorator(cls):class CLS_Wrapper:def __init__(self,*args):self.wrapped=cls(*args)# 拦截未定义属性的点号运算def __getattr__(self,attr):# 指向原类属性的点号运算return getattr(self.wrapped,attr)return CLS_Wrapper

描述

返回的类包装器是一个新类,与原类不同,并且将新类赋值给原类名称。

self.wrapped=cls:将原类赋值给类包装器的实例属性。

__getattr__():拦截类包装器的实例属性的点号运算。getattr可以使用属性管理的其他内置函数,比如__getattribute__(),__setattr__(),__delattr__(),__call__(),__str__()等,对属性进行管理和拦截。

return getattr(self.wrapped,attr):将拦截的点号运算,指向原类示例属性的点号运算。

return CLS_Wrapper:返回新类。

示例

>>> def cls_decorator(cls):print('clsid=',id(cls))class CLS_Wrapper:def __init__(self,*args):self.wrapped=cls(*args)def __getattr__(self,attr):return getattr(self.wrapped,attr)print('CLS_Wrapperid=',id(CLS_Wrapper)) return CLS_Wrapper>>> @cls_decorator
class AClass:def __init__(self,name):self.name=nameclsid= 2624479396864
CLS_Wrapperid= 2624479365712
# AClass 赋值为新类 CLS_Wrapper , id 相同
>>> id(AClass)
2624479365712
>>> ac=AClass('梯阅线条')
>>> ac.name
'梯阅线条'

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

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

相关文章

Linux前后端项目部署

目录 1.jdk&tomcat安装 配置并且测试jdk安装 修改tomcat 配置文件 登入tomcat 发布 安装mysql 导入sql数据 发布项目war包 redis安装 nginx安装 配置nginx域名映射 部署前端项目 centos 7的服务安装 安装jdk 安装tomcat 安装Mysql 安装redis 安装nginx 前后…

【Unity】Timer计时器属性及使用

可以代替协程完成延时操作 可以不用Update进行计时 GitHub开源计时插件 网址&#xff1a;https://github.com/akbiggs/UnityTimer/tree/master 导入&#xff1a;URL&#xff1a;https://github.com/akbiggs/UnityTimer.git 基本功能&#xff1a; 创建计时器&#xff1a; Time…

深入理解 Hadoop (四)HDFS源码剖析

HDFS 集群启动脚本 start-dfs.sh 分析 启动 HDFS 集群总共会涉及到的角色会有 namenode, datanode, zkfc, journalnode, secondaryName 共五种角色。 JournalNode 核心工作和启动流程源码剖析 // 启动 JournalNode 的核心业务方法 public void start() throws IOException …

【打卡】牛客网:BM80 买卖股票的最好时机(一)

模板的&#xff1a; 我的想法是&#xff0c;这个题就是找最大差。两个递归是可以解决的&#xff0c;时间复杂度是o(n^2)。但是题目要求时间复杂度是o(n)。 模板用了一个两行的dp数组&#xff0c;在一次for循环中&#xff0c;更新两行&#xff0c;是亮点。 第一行记录利润。全…

OpenHarmony之hdc

OpenHarmony之hdc 简介 hdc&#xff08;OpenHarmony Device Connector&#xff09;是 OpenHarmony 为开发人员提供的用于调试的命令行工具&#xff0c;通过该工具可以在Windows/Linux/MacOS等系统上与开发机或者模拟器进行交互。 类似于Android的adb&#xff0c;和adb类似&a…

探索Java中的Map:领略键值对的无限魅力

目录 1、前言 2、介绍Map 2.1 什么是Map 2.2 Map的特点 3、常用的Map实现类 3.1 HashMap 3.2 TreeMap 3.3 LinkedHashMap 3.4 Hashtable 3.5 ConcurrentHashMap 4、操作Map的常用方法 5、Map的应用场景 5.1 缓存 5.2 数据存储 5.3 计数器 6、常见问题解答 6.1…

Spring中线程池ThreadPoolTaskExecutor的使用

一、为什么要使用线程池 在项目中使用多线程时&#xff0c;通常建议使用线程池而不是直接使用 new Thread 的方式来创建线程。下面是一些原因&#xff1a; 资源管理和性能优化&#xff1a; 使用线程池可以更好地管理系统资源&#xff0c;控制并发线程数&#xff0c;避免创建过…

SEO 分步教程:初学者掌握的 8 个简单基础知识

如果您刚刚开始使用搜索引擎优化 &#xff08;SEO&#xff09;&#xff0c;那么分步 SEO 教程是有序的。在这一点上&#xff0c;你可能已经听说过一些基本术语&#xff0c;如关键词研究和页面优化。但是&#xff0c;您如何应用迄今为止收集的所有知识呢&#xff1f; 如果您刚刚…

k8s的存储卷

存储卷----数据卷 容器内的目录和宿主机的目录进行挂载 容器在系统上的生命周期是短暂的&#xff0c;delete&#xff0c;k8s用控制创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会回复到初始状态 一旦回到初始状态&#xff0c;所有的后天编辑的文件都会消…

获取直播间的最新评论 - python 取两个list的差集

python 取两个list的差集 作用&#xff1a;比如我要获取评论区列表&#xff0c;先获取了一遍&#xff0c;这个时候有人评论了几条&#xff0c;我再获取一遍后&#xff0c;找出多的那几条 使用set数据类型来取两个列表的差集。差集表示仅包含在第一个列表中而不在第二个列表中…

微信公众号——微信公众号实现发送模板消息

准备工作 在调用微信接口获取AccessToken时&#xff0c;需要使用到微信公众号的appid及appsecret&#xff0c;获取方式如下&#xff1a; 1.已有公众号 已有公众号&#xff1a; 有属于自己的公众号账户&#xff0c;登录微信公众平台(https://mp.weixin.qq.com)&#xff0c;在…

SWM341系列之SWM34SRET6介绍

SWM341系列的介绍 本文介绍了华芯微特SWM341系列主要性能&#xff0c;和其系列之一的SWM34SRET6-50驱动4.3寸800*480 TFTLCD显示的例程应用。 SWM341系列性能 SWM341是一款基于ARM Cortex-M33的32位微控制器&#xff0c;片上包含精度为 1%以内的 20MHz/40MHz 时钟&#xff0c;最…

起诉业务员飞单需要什么证据?

在商业活动中&#xff0c;业务员飞单是一种常见的违规行为&#xff0c;给企业带来了巨大的经济损失。如果企业怀疑业务员存在飞单行为&#xff0c;需要收集足够的证据来证明其行为&#xff0c;并采取法律手段维护企业的合法权益。那么&#xff0c;起诉业务员飞单需要什么证据呢…

【数据库原理】(19)在实际数据库设计中关系规范化的应用

一.关系规范化的基本原则 1. 规范化的目的和基本思想 目的&#xff1a;通过分解低一级范式的关系模式&#xff0c;转换为高一级范式的关系模式集合&#xff0c;以减少数据冗余和更新异常。 基本思想&#xff1a; “一事一地”&#xff1a;确保每个关系模式只描述一个概念、实…

odoo17 | 视图操作按钮

前言 到目前为止&#xff0c;我们主要通过声明字段和视图来构建我们的模块。在上一章中&#xff0c;我们刚刚通过计算字段和onchanges引入了业务逻辑。在任何真实的业务场景中&#xff0c;我们都会希望将一些业务逻辑链接到操作按钮。在我们的房地产示例中&#xff0c;我们希望…

代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素

代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素 文章目录 代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素1 数组理论基础&#xff08;基于面试&#xff09;1.1 面试问题针对 Python1.2 面试问题针对 C 2 LeetCode 704.二分查找2.1 二分查找的实现2.2 P…

Buzz 离线音频转字幕工具(完全免费,无需登录)

关于 Buzz Buzz 是一款可以自动识别语音为文本字幕的软件工具&#xff0c;基于 OpenAI 开源的 Whisper 自动语音识别模型&#xff0c;可以批量将音频或者是视频中的内容自动转化为带有时间的字幕&#xff0c;速度非常快&#xff0c;是一款能极大提高效率的生产力小工具。 Bu…

JavaScript-对象-笔记

1.字面量创建对象、对象的使用 对象就是一组 属性和方法的集合 属性&#xff1a; 特征 相当于变量 静态 是什么 方法&#xff1a; 行为 相当于函数 动态 干什么 创建对象 创建对象的第一种&#xff1a;使用字面量 {} 对象中的元素是键值对 使用逗号隔开 键:值 的形式 var 对象名…

Vue项目在ie浏览器中显示白屏优化提示

在工作中用到Vue开发项目&#xff0c;用户在IE浏览器打开页面&#xff0c;结果显示空白屏。作为开发者当然知道是浏览器版本过低导致语法不支持&#xff0c;但是用户不知情的情况下显示空白屏就很不友好。这时候有必要在页面上做点提示语告诉用户切换浏览器&#xff0c;下面是页…

千里之行始于足下,2024年低代码数字化选型“避坑指南“

千里之行&#xff0c;始于足下。企业数字化转型建设之路&#xff0c;亦始于选型。 在转型建设的过程中&#xff0c;数字化系统的选型往往被视为最关键的环节。一旦选型不当或出现失误&#xff0c;可能导致项目进展受阻&#xff0c;甚至直接导致项目失败。因此&#xff0c;一个良…