python之元类

最近刚好在准备面试,然后复习知识点。看了好多元类相关的文章,但还是心存疑惑🤔。

还是写点东西吧!

元类,官方的定义是,类的类型。而类型的顶点,便是type

  • metaclass - The class of a class. Class definitions create a class name, a class dictionary, and a list of base classes. The metaclass is responsible for taking those three arguments and creating the class. Most object oriented programming languages provide a default implementation. What makes Python special is that it is possible to create custom metaclasses. Most users never need this tool, but when the need arises, metaclasses can provide powerful, elegant solutions. They have been used for logging attribute access, adding thread-safety, tracking object creation, implementing singletons, and many other tasks.

上面的内容大致写的是:元类,是类的类型。然后定义了name(类的名称),dict(可用于传入一些内置参数),bases(包含所有父类的列表)。然后猿类可以根据些参数创建一个类。然后就是一些元类的用途,用于记录属性的获取、确保线程安全、跟踪对象的创建、实现单例模式,等等。

但只是这么说,我还是没理解他是个啥,然后整了些小实验:效果如下:

object.base
type.base
<class ‘object’>
type.class
<class ‘type’>
object.class
<class ‘type’>

先看父子关系,我们可以看到:
object没有父类,而type的父类是object。
因此,我们可以得出object是父类的顶点。

再看类型,同理:
object的类型是type,type的类型也是type。
因此,type是类型的顶点。但是,为什么object的类型也是type呢。所以我们的结论是,type是基于object实现的,而基于object实现的type实现的type被定义为了类型的顶点。

下面我们来看看元类的实际用途:

1、动态且快速地创建一个类

>>> t = type("test",(),{"a":0})
>>> t.a
0
>>> t
<class '__main__.test'>

2、追踪对象的创建(当然,在追踪的同时,我们也可以做一些事情,比如对属性的大小写做限制)。

class UpperAttrMetaclass(type):def __new__(cls, name, bases, dct):uppercase_attrs = {}for attr_name, attr_value in dct.items():if not attr_name.startswith('__'):uppercase_attrs[attr_name.upper()] = attr_valueelse:uppercase_attrs[attr_name] = attr_value# 使用修改后的属性创建新的类return super().__new__(cls, name, bases, uppercase_attrs)# 使用 UpperAttrMetaclass 元类创建一个新类
class MyClass(metaclass=UpperAttrMetaclass):my_attr = "hello"# 测试 MyClass 中的属性名是否已转换为大写
obj = MyClass()
print(obj.MY_ATTR)  # 输出: hello

经过测试发现,new__函数的的cls对象变量创建会经过以下逻辑:
1、当前类有__metaclass__这个属性吗?如果是,Python会在内存中通过__metaclass__创建一个名字为当前类的main函数类对象)
2、如果Python没有找到__metaclass
,它会继续在父类中寻找__metaclass__属性,并尝试做和前面同样的操作
3、如果Python在任何父类中都找不到__metaclass__,它就会在模块层次中去寻找__metaclass__,并尝试做同样的操作
4、如果还是找不到__metaclass__,Python就会用内置的type来创建这个类对象。

这也就是为什么,我们在用type不传参时,与不传metaclass参数时会得到类似的报错信息。判断type类的__call__逻辑是三个参数时,调用__new__函数创建实例。这也就符合了,我们上方的逻辑,type所有类型的顶点,所有的实例都是基于type的实例创建的。

3、实现单例模式(本质上利用了闭包思想)

class Singleton(type):_instances = {}def __call__(cls, *args, **kwargs):if cls not in cls._instances:cls._instances[cls] = super().__call__(*args, **kwargs)return cls._instances[cls]class MyClass(metaclass=Singleton):passobj1 = MyClass()
obj2 = MyClass()
print(obj1 is obj2)  # 输出: True

先写到这里,后面有空再写。。。

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

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

相关文章

Java流程控制

1. 流程控制 在一个程序中&#xff0c;有很多的代码&#xff0c;代码的执行顺序&#xff0c;就是流程。 用于控制代码流程的方式&#xff0c;就是流程控制 流程控制的分类&#xff1a; 顺序结构&#xff1a;代码从上到下&#xff0c;从右到左依次执行。 分支结构&#xff1a…

OpenAI的Sora的优点

OpenAI的Sora的优点主要包括以下几个方面&#xff1a; 1.强大的视频生成能力&#xff1a;Sora可以根据用户的文本提示或静态图像生成高质量、逼真的视频。它继承了DALL-E 3的画质和遵循指令能力&#xff0c;能够生成具有多个角色、包含特定运动的复杂场景&#xff0c;几乎达到…

Unity3d Mesh篇(一)— 创建简单三角面

文章目录 前言一、Mesh组成二、使用步骤三、效果四、总结 前言 Mesh&#xff08;网格&#xff09;是一种常用的3D图形表示方法&#xff0c;它由顶点&#xff0c;法线&#xff0c;UV 坐标&#xff0c;和三角形等组成。您可以使用 Mesh 类的方法来创建或修改网格&#xff0c;也可…

k8s学习(RKE+k8s+rancher2.x)成长系列之简配版环境搭建(三)

3.19.切换RKE用户&#xff0c;并做免密登录&#xff08;三台机器相互免密&#xff09; su rke cd~ ssh-keygen[rkemaster.ssh]$ssh-copy-id rkeslaver2 [rkemaster.ssh]$ssh-copy-id rkeslaver1 [rkemaster.ssh]$ssh-copy-id rkemaster3.20.搭建RKE集群 为了方便理解&#…

office的excel中使用,告诉我详细的解决方案,如何变成转化为金额格式

在Office的Excel中&#xff0c;如果你想将名为"MEREFIELD"的公式结果转换为金额格式&#xff0c;你可以遵循以下详细步骤来实现&#xff1a; 书写MEREFIELD公式&#xff1a; 首先&#xff0c;在Excel中输入或确认你的MEREFIELD公式。例如&#xff0c;假设这个公式是用…

基于STL的演讲比赛流程管理系统(个人学习笔记黑马学习)

1、演讲比赛程序需求 1.1比赛规则 学校举行一场演讲比赛&#xff0c;共有12个人参加。比赛共两轮&#xff0c;第一轮为淘汰赛&#xff0c;第二轮为决赛。每名选手都有对应的编号&#xff0c;如 10001~10012比赛方式:分组比赛&#xff0c;每组6个人;第一轮分为两个小组&#xff…

SpringBoot 条件注解一览无余

文章目录 条件注解是什么有哪些条件注解类条件注解Bean条件注解属性条件注解资源条件注解web应用条件注解SpEL( Spring Expression Language )表达式条件注解其他条件注解 总结 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍…

Java中的控制语句

控制语句包括3类&#xff1a;选择语句&#xff08;if语句&#xff0c;switch语句&#xff09;&#xff0c;循环语句&#xff08;for循环&#xff0c;while循&#xff0c;do..while..循环&#xff09;&#xff0c;转向语句&#xff08;break&#xff0c;continue&#xff0c;ret…

四、通信和网络安全—网络通信模型(CISSP)

目录 1.OSI七层参照模型 2.OSI七层模型与TCP/IP网络模型的关系 2.1 网络层(Application Layer)

Flutter使用问题整理

前言 写这篇文章是为了记录平时在使用flutter时遇到的问题&#xff0c;及解决方案&#xff0c;方便再次遇到时能够快速解决。 问题及解决 问题1 真机运行项目&#xff0c;在构建时提示 Running Gradle task assembleDebug... 41.8s [!] App r…

OpenCV中inRange函数

在OpenCV中&#xff0c;inRange函数用于根据颜色范围从图像中提取特定的颜色区域。这个函数检查输入图像中的每个像素&#xff0c;如果像素值位于指定的范围内&#xff0c;则在输出图像&#xff08;或掩码&#xff09;中对应位置的像素被设置为白色&#xff08;或者说是255&…

基于STM32的光照检测系统设计

基于STM32的光照检测系统设计 摘要: 随着物联网和智能家居的快速发展,光照检测系统在智能环境控制中扮演着越来越重要的角色。本文设计了一种基于STM32的光照检测系统,该系统能够实时检测环境光强度,并根据光强度调节照明设备,实现智能照明控制。本文首先介绍了系统的总体…

消息队列-RabbitMQ:MQ作用分类、RabbitMQ核心概念及消息生产消费调试

1、MQ 的相关概念 1&#xff09;什么是 MQ MQ (message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是 message 而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息。在互…

Delphi v11 安卓权限申请

问题 Delphi 10.4 的安卓权限申请代码&#xff0c;在 Delphi 11 下面编译无法通过。 原因 原因是里面有几个变量类型的定义有所不同。 procedure TDmBLE.RequestPermissionsResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TAr…

基于python+django+vue.js开发的医院门诊管理系统/医疗管理系统

功能介绍 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 功能包括&#xff1a;医生管理、科室管理、护士管理、住院管理、药品管理、用户管理、日志管理、系统信息模块。 源码地址 https://github.com/geeeeeee…

Vue报错,xxx is defined #变量未定义

vue.js:5129 [Vue warn]: Error in v-on handler: "ReferenceError: count is not defined" 浏览器将这个变量 当做全局变量了&#xff0c;事实上它只是实例中的变量 加上this指定&#xff0c;是vue实例中的变量

Itext生成pdf文件,html转pdf时中文一直显示不出来

之前使用freemark模板渲染ftl页面,转出的pdf中&#xff0c;css2有些样式好像不支持&#xff0c;比较常用的居中样式都没有效果&#xff0c;text-align:center 改造成使用html页面来转pdf&#xff0c;css2的样式可以生效,itext是不支持css3的弹性布局的ITextRenderer pdfRendere…

AI之Sora:Sora(文本指令生成视频的里程碑模型)的简介(能力/安全性/技术细节)、使用方法、案例应用之详细攻略

AI之Sora&#xff1a;Sora(文本指令生成视频的里程碑模型)的简介(能力/安全性/技术细节)、使用方法、案例应用之详细攻略 导读&#xff1a;Sora 是OpenAI研发的一个可以根据文字描述生成视频的AI模型。它的主要特性、功能以及OpenAI在安全和应用方面的策略的核心要点如下所示&a…

分布式锁的应用场景及实现

文章目录 分布式锁的应用场景及实现1. 应用场景2. 分布式锁原理3. 分布式锁的实现3.1 基于数据库 分布式锁的应用场景及实现 1. 应用场景 电商网站在进行秒杀、特价等大促活动时&#xff0c;面临访问量激增和高并发的挑战。由于活动商品通常是有限库存的&#xff0c;为了避免…

MySQL 基础知识(十)之 MySQL 架构

目录 1 MySQL 架构说明 2 连接层 3 核心业务层 3.1 查询缓存 3.2 解析器 3.3 优化器 3.4 执行器 4 存储引擎层 5 参考文档 1 MySQL 架构说明 下图是 MySQL 5.7 及其之前版本的逻辑架构示意图 MySQL 架构大致可分为以下三层&#xff1a; 连接层&#xff1a;负责跟客户…