系统学习Python——装饰器:类装饰器-[初探类装饰器和元类]

分类目录:《系统学习Python》总目录


函数装饰器是如此有用,以至于Python2.X和Python3.X都扩展了这一模式,允许装饰器应用于类和函数。简而言之,类装饰器类似于函数装饰器,但它们是在一条class语句的末尾运行,并把一个类名重新绑定到一个可调用对象。同样,它们可以用来在类一创建后就管理它们,或者当随后创建实例的时候插人一层包装逻辑来管理实例。代码结构如下:

def decorator(aClass):pass@decorator
class C:pass

被映射为下列等价代码:

def decorator(aClass):passclass C:passC = decorator(C)

类装饰器也可以扩展类自身,或者返回一个拦截了随后的实例创建调用的代理对象。例如,在文章《系统学习Python——类(class):静态方法(staticmethod)和类方法(classmethod)-[实例:用类方法计数]》的示例中,我们可以使用这个钩子来自动地扩展需要实例计数器或任何其他所需数据的类:

def count(aClass):aClass.numInstances = 0return aClass@count
class Spam:pass@count
class Sub(Spam):pass@count
class Other(Spam):pass

事实上,正如所编写的那样,该装饰器可被用于类或函数,我们可以在初始化对象属性之后,返回在这两种上下文中定义的对象:

def count(aClass):aClass.numInstances = 0return aClass@count
def spam():pass@count
class Sub:pass@count
class Other:passprint(spam.numInstances)
print(Other.numInstances)

输出:

0
0

尽管这个装饰器管理了一个函数或者类本身,正如我们将在后面的文章看到的,类装饰器也可以通过拦截构造函数,并将新的实例对象包在一个代理(这个代理会部署属性访问工具来拦截之后的属性访问请求)中,来管理一个实例的全部接口,下面是这个模型的简单版本:

def decorator(cls):class Proxy:def __inir__(self, *args):self.wrapper = cls(*args)def __getattr__(self, name):return getattr(self.wrapper, name)return Proxy@decorator
class C:passX = C()

而元类是一种类似的基于类的高级工具,其用途往往与类装饰器有所重合。它们提供了一种备选的模型,能把一个类对象的创建路由到顶级type类的一个子类,在一条class语句的最后。为了获得对一个新的类对象创建或初始化的控制,一个元类通常重新定义type类的__new__或者__init__方法(这种做法通常用于拦截这两种方法之一)。最终效果就像类装饰器一样,定义了在类创建时自动运行的代码。在这里,这一步将类名绑定到一个用户定义元类的调用结果。事实上,一个元类完全可以不必是一个类。我们将探讨这种模糊了元类与装饰器之间区别的可能性,并且甚至比较这两种工具在许多不同场景中的功能上的等价性。

类装饰器和元类这两种方案都可以用来扩展一个类或返回一个任意的对象来替代它一一一这是一种几乎拥有无限的、基于类的定制化可能性的协议。我们后面会看到,元类也可以定义处理它们实例类的方法,而不是这些实例类的普通实例一一这是一种和类方法很相似的技术,而且可以用类装饰器代理中的方法和数据来模拟实现,或者甚至是一个返回一个元类实例的类装饰器。

参考文献:
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.

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

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

相关文章

OpenHarmony—环境准备

JS SDK安装失败处理指导 问题现象 下载JS SDK时,下载失败,提示“Install Js dependencies failed”。解决措施 JS SDK下载失败,一般情况下,主要是由于npm代理配置问题,或未清理npm缓存信息导致,可按照如…

方案|AI智能监控如何从区域入侵与摄像头异常方面助力野外农场安全监管

大家都知道,旭帆科技的AI分析算法在监控中的应用十分广泛,除了常见的人体事件、行为事件、着装、车辆等算法,摄像头异常检测也十分重要。近期就有一个用户在我们这定制了一个野外摄像头异常检测算法系统。 方案需求 该用户的需求为需要在自己…

java8 查找和匹配方法(`anyMatch`)(`allMatch`、`noneMatch`)(`findAny`)(`findFirst`)

5.3 查找和匹配 5.3.1 检查谓词是否至少匹配一个元素&#xff08;anyMatch&#xff09; anyMatch方法可以回答“流中是否有一个元素能匹配给定的谓词”。 boolean anyMatch(Predicate<? super T> predicate);// 菜单里面是否有素食可选择 if(menu.stream().anyMatc…

上博东馆古蜀文明展,文物保护系统移动端与离线设备齐上阵

一、上博东馆古蜀文明展开展 备受瞩目的“星耀中国&#xff1a;三星堆金沙古蜀文明展”文物悉数到位。这是我国较大、最完整的古蜀文明展览&#xff0c;将在2月2日在博物馆开放“三部曲”。展览由上海博物馆和全国28家文化考古机构共展出363件/套文物。在如此重要的展览中&…

Powershell Install telegraf 实现Grafana Windows 图形展示

influxd2前言 influxd2 是 InfluxDB 2.x 版本的后台进程,是一个开源的时序数据库平台,用于存储、查询和可视化时间序列数据。它提供了一个强大的查询语言和 API,可以快速而轻松地处理大量的高性能时序数据。 telegraf 是一个开源的代理程序,它可以收集、处理和传输各种不…

HiveSQL题——聚合函数(sum/count/max/min/avg)

目录 一、窗口函数的知识点 1.1 窗户函数的定义 1.2 窗户函数的语法 1.3 窗口函数分类 聚合函数 排序函数 前后函数 头尾函数 1.4 聚合函数 二、实际案例 2.1 每个用户累积访问次数 0 问题描述 1 数据准备 2 数据分析 3 小结 2.2 各直播间最大的同时在线人数 …

Selenium 隐藏浏览器指纹特征的几种方式

我们使用 Selenium 对网页进行爬虫时&#xff0c;如果不做任何处理直接进行爬取&#xff0c;会导致很多特征是暴露的 对一些做了反爬的网站&#xff0c;做了特征检测&#xff0c;用来阻止一些恶意爬虫 本篇文章将介绍几种常用的隐藏浏览器指纹特征的方式 1. 直接爬取 目标对…

CHS_04.2.3.3+互斥锁

CHS_04.2.3.3互斥锁 进程互斥&#xff1a;锁 接下来 用于实现互斥的一种方法 你可以简单理解为 锁就是一个bool的变量 进程互斥&#xff1a;锁 只有true和false或者零和一两种状态分别表示当前已上锁或者没有上锁 有这样的两个函数可以操作锁acquire 这个函数就是上锁获得 锁…

linux -- 中断管理 -- softirq机制

softirq的起始 do_IRQ();--> irq_enter(); //HARDIRQ部分的开始 更新系统中的一些统计量 标识出HARDIRQ上下文--> generic_irq_handler(); --> irq_exit(); //softirq部分的起始irq_exit /** Exit an interrupt context. Process softirqs if needed and possibl…

知识蒸馏(paper翻译)

paper&#xff1a;Distilling the Knowledge in a Neural Network 摘要&#xff1a; 提高几乎所有机器学习算法性能的一个非常简单的方法是在相同的数据上训练许多不同的模型&#xff0c;然后对它们的预测进行平均[3]。 不幸的是&#xff0c;使用整个模型集合进行预测非常麻烦…

操作系统A-第四和五章(存储器)作业解析

目录 1、在请求分页系统中&#xff0c;某用户程序的逻辑地址空间为 16 页&#xff0c;每页 1KB&#xff0c;分配的内存空间为 8KB。假定某时刻该用户的页表如下表所示。 试问&#xff1a;(1)逻辑地址 184BH 对应的物理地址是多少&#xff1f;&#xff08;用十六进制表示&…

基于SSM的二手车交易网站设计与实现(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的二手车交易网站设计与实现&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过…

全国网络安全行业职业技能大赛WP

word_sercet 文档被加密 查看图片的属性 在备注可以看到解压密码 解密成功 在选项里面把隐藏的文本显示出来 可以看到ffag easy_encode 得到一个bmp二维码 使用qr research 得到的密文直接放瑞士军刀 base32解码base64解码hex解码 dir_pcap 直接搜索flag 发现flag…

力扣唯一元素的和

题目&#xff1a; 给你一个整数数组 nums 。数组中唯一元素是那些只出现 恰好一次 的元素。 请你返回 nums 中唯一元素的 和 。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,2] 输出&#xff1a;4 解释&#xff1a;唯一元素为 [1,3] &#xff0c;和为 4 。示例 2&#xf…

mysql之基本查询

基本查询 一、SELECT 查询语句 一、SELECT 查询语句 查询所有列 1 SELECT *FORM emp;查询指定字段 SELECT empno,ename,job FROM emp;给字段取别名 SELECT empno 员工编号 FROM emp; SELECT empno 员工编号,ename 姓名,job 岗位 FROM emp; SELECT empno AS 员工编号,ename …

JavaScript 基本引用类型Date详解

Date ​ Date 类型提供关于日期和时间的信息&#xff0c;包括当前日期、时间及相关计算。 ​ ECMAScript 的 Date 类型参考了 Java 早期版本中的 java.util.Date。为此&#xff0c;Date 类型将日期保存为自协调世界时&#xff08;UTC&#xff0c;Universal Time Coordinated&…

Codeforces Round 799 (Div. 4)

目录 A. Marathon B. All Distinct C. Where’s the Bishop? D. The Clock E. Binary Deque F. 3SUM G. 2^Sort H. Gambling A. Marathon 直接模拟 void solve() {int ans0;for(int i1;i<4;i) {cin>>a[i];if(i>1&&a[i]>a[1]) ans;}cout<&l…

离线生成双语字幕,一键生成中英双语字幕,基于AI大模型,ModelScope

离线生成双语字幕整合包,一键生成中英双语字幕,基于AI大模型 制作双语字幕的方案网上有很多&#xff0c;林林总总&#xff0c;不一而足。制作双语字幕的原理也极其简单&#xff0c;无非就是人声背景音分离、语音转文字、文字翻译&#xff0c;最后就是字幕文件的合并&#xff0c…

Next.js 学习笔记(七)——样式

样式 Next.js 支持不同的应用程序样式设计方法&#xff0c;包括&#xff1a; 全局 CSS&#xff1a;对于有传统 CSS 使用经验的人来说&#xff0c;使用简单且熟悉&#xff0c;但随着应用程序的增长&#xff0c;可能会导致 CSS 包过大&#xff0c;难以管理样式。CSS 模块&#…

Centos安装mysql/mariadb

1,yum install mysql-apt-config_0.8.12-1_all.deb 似乎后面会有冲突,不建议安装mysql了,直接mariadb吧 2, No such command: uninstall. Please use /usr/bin/yum --help It could be a YUM plugin command, try: "yum install dnf-command(uninstall)" It…