面向对象进阶之元类
6. 元类
Python 中一切皆对象,对象是由类实例化产生的。那么类应该也有个类去产生它,利用 type() 函数我们可以去查看:
class A:pass
a1 = A()
print(type(a1))
print(type(A))
<class '__main__.A'>
<class 'type'>
由上可知,a1 是类 A 的对象,而 A 是 type 类产生的对象。
当我们使用 class 关键字的时候,Python 解释器在加载 class 关键字的时候会自动创建一个对象(但是这个对象非类实例产生的对象)。
6.1 什么是元类
元类是类的类,也就是类的模板。用于控制创建类,正如类是创建对象的模板一样。
在 Python 中,type 是一个内建的元类,它可以用来控制生成类。Python 中任何由 class 关键字定义的类都 type 类实例化的对象。
6.2 定义类的两种方法
使用 class 关键字定义:
class Foo:pass
使用 type() 函数定义:
type() 函数有三个参数:第一个为类名(str 格式),第二个为继承的父类(tuple),第三个为属性(dict)。
x = 2
def __init__(self, name, age):self.name = nameself.age = agedef test(self):print('Hello %s' % self.name)Bar = type('Bar', (object,), {'x': 1, '__init__': __init__, 'test': test, 'test1': test1}) # 类属性、函数属性
print(Bar)
print(Bar.__dict__)b1 = Bar('rose', 18)
b1.test()
<class '__main__.Bar'>
{'x': 1, '__init__': <function __init__ at 0x00000000055A6048>, 'test': <function test at 0x00000000055A60D0>, 'test1': <function test1 at 0x0000000005596BF8>, '__module__': '__main__', '__dict__': <attribute '__dict__' of 'Bar' objects>, '__weakref__': <attribute '__weakref__' of 'Bar' objects>, '__doc__': None}
Hello rose
6.3 __init__ 与 __new__
构造方法包括创建对象和初始化对象,分为两步执行:先执行 __new__,再执行 __init__。
__new__:在创建对象之前调用,它的任务是创建对象并返回该实例,因此它必须要有返回值,是一个静态方法。__init__:在创建对象完成后被调用,其功能是设置对象属性的一些属性值。
也就是 __new__创建的对象,传给 __init__ 作为第一个参数(即 self)。
class Foo:def __init__(self):print('__init__方法')print(self)def __new__(cls,*args, **kwargs):print('__new__方法')print(cls, args, kwargs)ret = object.__new__(cls,*args, **kwargs) # 创建实例对象print(ret)return ret
f1 = Foo()
__new__方法
<class '__main__.Foo'> () {} # Foo 类本身
<__main__.Foo object at 0x00000000055AFF28> # 类的实例对象
__init__方法
<__main__.Foo object at 0x00000000055AFF28>
总结
__new__至少要有一个参数 cls,代表要实例化的类,由解释器自动提供。必须要有返回值,可以返回父类出来的实例,或直接object出来的实例。__init__的第一个参数 self 就是__new__的返回值。
6.4 自定义元类
如果一个类没有指定元类,那么它的元类就是 type,也可以自己自定义一个元类。
class MyType(type):def __init__(self, a, b, c): # self:Bar a:Bar b:() 父类 c:属性字典print(self) print('元类 init 执行~')def __call__(self, *args, **kwargs):print('call 方法执行~')obj = object.__new__(self) # Bar 产生实例对象,即 b1print(obj)self.__init__(obj, *args, **kwargs) # Bar.__init__(b1, name)return objclass Bar(metaclass=MyType): # Bar = MyType('Bar', (object,), {}) 触发 MyType 的 __init__() def __init__(self, name): # self:f1self.name = nameb1 = Bar('rose') # Bar 也是对象,对象加括号,触发 __call__()
print(b1.__dict__)
<class '__main__.Bar'>
元类 init 执行~
call 方法执行~
<__main__.Bar object at 0x00000000055D3F28>
{'name': 'rose'}
加载完程序后,首先执行 metaclass=MyType,它相当于 Bar = MyType('Bar', (object,), {}),它会执行 MyType 的 __init__ 执行。
再接着执行 b1=Bar('rose) ,因为 Bar 也是对象,对象加括号就会触发 __call__() 方法,再由 __new__() 方法产生实例对象,最后返回。
总结
- 元类是类的模板,其功能是产生类对象,那么就可以模拟通过
__new__()产生一个类的对象,并返回。 - 一切皆对象,那么类也是个对象,它是由 type 产生。
相关文章:
面向对象进阶之元类
6. 元类 Python 中一切皆对象,对象是由类实例化产生的。那么类应该也有个类去产生它,利用 type() 函数我们可以去查看: class A:pass a1 A() print(type(a1)) print(type(A))<class __main__.A> <class type>由上可知…...
【Android AIDL之详细使用】
Android AIDL之详细使用一级目录概述使用场景语法相关编码实践服务端:java文件修改AndroidManifest客户端坑一级目录 概述 AIDL叫Android接口定义语言,是用于辅助开发者完成Android跨进程编程的工具。 从某种意义上说AIDL其实是一个模板,因…...
ASP.NET MVC | 简介
目录 前提 1.教程 2.MVC 编程模式 最后 前提 在学习学过很多课程,但是最主要学的还是ASP.NET MVC这门课程,工作也是用的ASP.NET MVC,所以写一点ASP.NET MVC的东西,大家可以来看看,我自己不会的时候也不用找别的地方…...
95后刚毕业2、3年就年薪50W,才发现,打败我们的不是年龄····
一刷朋友圈,一读公众号,一打开微博,甚至是一和朋友聊天,这些让人焦虑的话题总会铺天盖地的袭来: Ta刚毕业半年,就升职加薪当上了测试主管 (同样是一天24小时,为什么同龄人正在抛弃…...
动态分析和静态分析最主要的区别是什么?
动态分析和静态分析主要的区别是什么? 动态分析和静态分析的主要区别是是否考虑时间因素。 动态分析(dynamic analysis)是相对于静态分析来讲的,动态分析是只改变一下自变量,因变量相应的做出的改变,动态改…...
WebUI 学习笔记
WebUI 学习笔记 背景此插件主要用于在数字孪生方向做 UI 显示的效果。比如一些温度曲线需要显示出来,可以直接用插件,配合html 文件,直接显示出来。 准备工作我们采用4.27 版本进行开发;...
C# 中常见的设计模式附带代码案例
设计模式是一套被广泛应用于软件设计的最佳实践,它们可以帮助开发者解决特定的问题,提高代码的可重用性、可读性和可维护性。本文将介绍 C# 中常见的几种设计模式,并提供相应的示例代码。 工厂模式 工厂模式是一种创建型设计模式,…...
秋招面试问题整理之机器学习篇
文章目录随机森林在决策树的哪些方面做出了改进随机森林里每棵树的权重不一定会变成什么模型方差和偏差,正则化解决的是方差大还是偏差大的问题正则化的方法总结了解VC维吗svd了解吗随机森林在决策树的哪些方面做出了改进 回答思路: 随机森林和决策树有…...
SuperMap超图使用简单笔记
1 需求: 项目使用的是openlayer和Cesium,现在需要使用超图的图层,和引入实景公路功能。 2 使用过程中出现一下疑问点记录如下 : 超图: 北京超图软件股份有限公司是全球第三大、亚洲最大的地理信息系统(G…...
从0探索NLP——神经网络
从0探索NLP——神经网络 1.前言 一提人工智能,最能想到的就是神经网络,但其实神经网络只是深度学习的主要实现方式。 现在主流的NLP相关任务、模型大都是基于深度学习也就是构建神经网络实现的,所以这里讲解一下神经网络以及简单的神经网络…...
计算机操作系统和进程
✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 ✨每日一语:心平能愈三千疾,心静可通万事理。 目 录🐬一. 操作系统🍦1. 操作系统是什么?🍨2. 操作系统的两个…...
JAVA服务端实现页面截屏(附代码)
JAVA服务端实现页面截屏适配需求方案一、使用JxBrowser使用步骤:方案二、JavaFX WebView使用步骤:方案三、Headless Chrome使用步骤:综上方案对比记录我的一个失败方案参考适配需求 有正确完整的地址url;通过浏览器能打开该url对…...
Java入门要知道!
首先我们都知道的是Java是一门面向对象的编程语言,不仅吸收了C语言的各种优点,还摒弃了C里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向…...
[6/101] 101次软件测试面试之经典面试题剖析
01、自我介绍答:大家好,我是一名软件测试工程师,但我更喜欢称自己为“软件bug捕手”。我相信,软件测试工程师的使命就是让软件更加健壮、更加可靠、更加美好。我们就像是一群“特警”,在黑暗的代码中寻找漏洞和缺陷&am…...
电脑c盘满了变成红色了怎么清理,清理c盘详细攻略
我们的电脑当用了一段时间之后,其实自然而然的就会有一点点卡,其实这是因为我们的电脑c盘满了,所以会造成卡顿是正常的,今天我们就来聊一聊电脑c盘满了变成红色了怎么清理? 一.电脑c盘为啥会满 软件安装:当…...
现在的00后,实在是太卷了
现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的,工作没两年,跳槽到我们公司起薪18K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天,原来这位小老弟家里条…...
RocketMQ概述
RocketMQ入门学习MQ概述MQ简介MO用途限流削峰异步解耦数据收集常见的MQ产品ActiveMQRabbitMQKafkaRocketMQ对比MQ常见协议JMSSTOMPAMOPMQTTMQ概述 MQ简介 MQ,Message Queue,是一种提供消息队列服务的中间件,也称为消息中间件,是…...
解决Ubuntu22.04.1上安装ch34x串口驱动报 Key was rejected by service 需要签名的问题
解决Ubuntu22.04.1上安装ch34x串口驱动报 Key was rejected by service 需要签名的问题问题官网下载解压驱动包编译安装给驱动签名再来载入模块(设备驱动程序)问题 Ubuntu22.04.1 Linux版本5.19.0-32-generic 运行Qt串口通信 m_serialPort->open(QIO…...
[python入门㊿] - python如何打断点
目录 ❤ 什么是bug(缺陷) ❤ python代码的调试方式 ❤ 使用 pdb 进行调试 测试代码示例 利用 pdb 调试 退出 debug debug 过程中打印变量 停止 debug 继续执行程序 debug 过程中显示代码 使用函数的例子 对函数进行 debug 在调试的时候动态改变值 ❤ 使用 PyC…...
CCNP350-401学习笔记(501-550题)
501、Refer to the exhibit. What is the effect of the configuration? A. The device will allow users at 192.168.0.202 to connect to vty lines 0 through 4 using the password ciscotestkey B. The device will allow only users at 192 168.0.202 to connect to vty …...
CUA Computer SDK:虚拟机自动化的终极解决方案,让AI代理掌控桌面级交互
CUA Computer SDK:虚拟机自动化的终极解决方案,让AI代理掌控桌面级交互 【免费下载链接】cua Create and run high-performance macOS and Linux VMs on Apple Silicon, with built-in support for AI agents. 项目地址: https://gitcode.com/GitHub_T…...
多模态大模型入门:从CLIP到Qwen-VL,手把手教你搭建第一个视觉语言模型
多模态大模型实战:从CLIP到Qwen-VL的视觉语言探索之旅 当一张图片胜过千言万语时,多模态大模型正在重新定义人机交互的边界。想象一下,上传一张街景照片,AI不仅能识别出咖啡馆招牌上的文字,还能根据店内装修风格推荐适…...
3分钟掌握医学文献关键信息:本草模型如何从肝癌研究中提取核心知识
3分钟掌握医学文献关键信息:本草模型如何从肝癌研究中提取核心知识 【免费下载链接】Huatuo-Llama-Med-Chinese Repo for BenTsao [original name: HuaTuo (华驼)], Instruction-tuning Large Language Models with Chinese Medical Knowledge. 本草(原名…...
【苍穹外卖 | 篇⑥】登录流程
在牛某网看见了牛肉哥的帖子之后,打算向牛肉大佬学习,故开始书写CSDN博客,通过博客的方式来巩固自身知识学习。因为之前有粗略的学习了Java Web 的基础课程,所以博客内容主要是巩固之前学习当中的模糊点,以及一些自己认…...
嵌入式按键事件处理框架:高可靠消抖与复合操作状态机
1. Button库深度解析:面向嵌入式系统的高可靠性按键事件处理框架1.1 设计定位与工程价值Button库并非简单的GPIO电平读取封装,而是一个面向工业级嵌入式应用的状态感知型按键事件引擎。其核心设计目标是解决传统按键处理中长期存在的三大工程痛点&#x…...
解决Windows内存不足困扰:Mem Reduct内存管理实战指南
解决Windows内存不足困扰:Mem Reduct内存管理实战指南 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct 您…...
Kylin V10 SP1桌面美化全攻略:从默认主题到个性化定制,让你的麒麟系统焕然一新
Kylin V10 SP1桌面美学革命:打造高效与美感兼具的麒麟系统工作空间 第一次打开Kylin V10 SP1系统时,那个默认的"寻光"主题确实给人一种清新简洁的感觉。但日复一日面对相同的界面,就像每天穿着同样的衣服上班——功能上没问题&…...
别让你的 Coding Agent 瞎忙活,你最缺的可能是这套 Harness 规则
别让你的 Coding Agent 瞎忙活,你最缺的可能是这套 Harness 规则 团队把 Claude Code、Codex、Cursor 这类工具接进日常开发后,最先暴露出的瓶颈通常在协作环节。 一个简单的 bug fix 任务,agent 可能会扩出十几个文件的改动。 跑了一行测试…...
DanKoe 视频笔记:一人企业构建指南:从零到百万美元的教育业务(每日工作2-4小时)
在本课程中,我们将学习如何构建一个单人教育业务,实现从零到年收入百万美元的目标,同时将每日工作时间控制在2-4小时。我们将探讨其核心理念、实施步骤以及背后的进化逻辑。 概述 传统的创业路径往往伴随着高风险、高投入和漫长的工作时间。…...
BepInEx Linux部署实战指南:从环境诊断到故障自愈
BepInEx Linux部署实战指南:从环境诊断到故障自愈 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 一、环境诊断:你的Linux系统准备好了吗? 为什…...
