Python类及元类的创建流程

Python类及元类的创建流程

  • 代码
  • 运行结果
  • 再看type和object的关系和约定
  • type和object具有的方法不一样
  • 看代码和运行结果,可以完全理解python的执行过程。再补充几点,

代码

class MetaCls(type):print('0>>>', 'MetaCls', 0)def __init__(self, name, bases=None, dict=None):print('5>>>',self, '__init__',1)print('     MetaCls','__init__',id(self))super(MetaCls,self).__init__(name, bases, dict)def __new__(cls, *args, **kwagrs):print('4>>',cls, '__new__',2)print('     args',*args)print('     kwagrs',**kwagrs)print('     MetaCls','__new__',id(cls))print('     MetaCls','__mro__', MetaCls.__mro__)return super(MetaCls, cls).__new__(cls, *args, **kwagrs)print('1>>>', 'MetaCls',3)        print("========1========")class Pa(metaclass=MetaCls):print('2>>>', 'Pa',4)def __init__(self, num):self.num = numprint('7>>>', self, '__init__',5)print('     Pa','__init__',id(self))def __new__(cls, *args, **kwagrs):print('6>>>', cls, '__new__',6)print('     args',*args)print('     kwagrs',**kwagrs)print('     Pa','__new__',id(cls))print('     Pa','__mro__',Pa.__mro__)return super(Pa, cls).__new__(cls)# return object.__new__(cls)print('3>>>', 'Pa',7)print("========2========")son = Pa(10000)
print('8>>>',8)
print('     ',type(son))
print('9>>>',9)
print('     ',son.num)
print('     son',id(son))
print('10>>>',10)
metaclass = MetaCls('meta',(),{})
print('     metaclass', metaclass)

运行结果

0>>> MetaCls 0
1>>> MetaCls 3
========1========
2>>> Pa 4
3>>> Pa 7
4>> <class '__main__.MetaCls'> __new__ 2args Pa () {'__module__': '__main__', '__qualname__': 'Pa', '__init__': <function Pa.__init__ at 0xf62558>, '__new__': <function Pa.__new__ at 0xb9d520>, '__classcell__': <cell at 0xe00998: empty>}kwagrsMetaCls __new__ 12179720MetaCls __mro__ (<class '__main__.MetaCls'>, <class 'type'>, <class 'object'>)
5>>> <class '__main__.Pa'> __init__ 1MetaCls __init__ 16757312
========2========
6>>> <class '__main__.Pa'> __new__ 6args 10000kwagrsPa __new__ 16757312Pa __mro__ (<class '__main__.Pa'>, <class 'object'>)
7>>> <__main__.Pa object at 0x926870> __init__ 5Pa __init__ 9594992
8>>> 8<class '__main__.Pa'>
9>>> 910000son 9594992
10>>> 10
4>> <class '__main__.MetaCls'> __new__ 2args meta () {}kwagrsMetaCls __new__ 12179720MetaCls __mro__ (<class '__main__.MetaCls'>, <class 'type'>, <class 'object'>)
5>>> <class '__main__.meta'> __init__ 1MetaCls __init__ 11834720metaclass <class '__main__.meta'>

再看type和object的关系和约定

>>> object.__bases__
()>>> object.__bases__.__bases__
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute '__bases__'>>> object.__bases__.__class__
<class 'tuple'>>>> object.__class__
<class 'type'>>>> type.__bases__
(<class 'object'>,)>>> type.__class__
<class 'type'>>>> ().__bases__
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute '__bases__'>>> ().__class__
<class 'tuple'>>>> ().__class__.__bases__
(<class 'object'>,)

python中type和object的关系图

type和object具有的方法不一样

>>> dir(type)
['__abstractmethods__', '__annotations__', '__base__', '__bases__', '__basicsize__', '__call__', '__class__', '__delattr__', '__dict__', '__dictoffset__', '__dir__', '__doc__', '__eq__', '__flags__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__instancecheck__', '__itemsize__', '__le__', '__lt__', '__module__', '__mro__', '__name__', '__ne__', '__new__', '__or__', '__prepare__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__setattr__', '__sizeof__', '__str__', '__subclasscheck__', '__subclasses__', '__subclasshook__', '__text_signature__', '__weakrefoffset__', 'mro']>>> dir(object)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

看代码和运行结果,可以完全理解python的执行过程。再补充几点,

  • __new__不一定需要重写。
  • 元类可以继承于object或者type或者其他类。如果没有显式的写成父类,默认是继承于object。
  • 如果元类要调用父类的__new__和__init__,传递的参数要和父类方法的一致。注意:type和object中的方法和参数是不一定相同,比如__new__的参数。官方文档对object的说明,官方文档对type的说明
  • object没有__call__。
  • __new__中一定有return返回类或实例,__init__中没有return。
  • 推荐阅读,其中核心之一是

class Foo(object, metaclass=MyMetaclass, kwarg1=value1):

它在元类中转换为
def new(cls, clsname, bases, dct, kwargs1=default):

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于微型5G网关的酒店服务机器人应用

智能机器人在酒店中已经越来越常见&#xff0c;并且也是提升客户体验、提高服务效率的重要工具。然而&#xff0c;尽管这些机器人在自动化服务方面可以发挥着重要作用&#xff0c;但它们仍然面临着一些通信、组网和在线管理方面的痛点。 针对这些难题&#xff0c;可以通过部署微…

Python边界值测试工具:生成指定大小文件

在进行软件测试的过程中&#xff0c;经常会有文件上传功能的需求&#xff08;例如头像上传、商品图上传等&#xff09;&#xff0c;这时候就需要考虑文件大小的边界值&#xff0c;例如只可上传1-2MB的图片&#xff0c;5-10MB的文件&#xff0c;想要验证需求的话&#xff0c;就需…

CVPT: Cross-Attention help Visual Prompt Tuning adapt visual task

论文汇总 当前的问题 图1:在VTAB-1k基准测试上&#xff0c;使用预训练的ViT-B/16模型&#xff0c;VPT和我们的CVPT之间的性能和Flops比较。我们将提示的数量分别设置为1、10、20、50,100,150,200。 如图1所示&#xff0c;当给出大量提示时&#xff0c;VPT显示了性能的显著下降…

电脑ip会因为换了网络改变吗

在当今数字化时代&#xff0c;IP地址作为网络世界中的“门牌号”&#xff0c;扮演着至关重要的角色。它不仅是设备在网络中的唯一标识&#xff0c;也是数据交换和信息传递的基础。然而&#xff0c;对于普通用户而言&#xff0c;一个常见的问题便是&#xff1a;当电脑连接到不同…

三菱变频器Modbus-RTU 通讯规格

能够从变频器的 RS-485 端子使用 Modbus-RTU 通讯协议&#xff0c;进行通讯运行和参数设定。 NOTE: 1、使用 Modbus-RTU 通讯协议时&#xff0c;请设定Pr.549 协议选择 “1” 2、从主机按地址0(站号0)进行hodbus-RTU通讯时&#xff0c;为广播通讯&#xff0c;变频器不向主机发…

QT编译后,如何手动运行,或复制到其他机器运行

编译后&#xff08;文件名叫Work.exe&#xff09;&#xff0c;通过QT功能&#xff0c;是可以成功运行的。如果在目录中双击&#xff0c;或复制到其他机器上运行&#xff0c;就会失败。怎么办&#xff1f; 打开命令窗口 运行命令 D:\Work\build\release>windeployqt Work.e…

写论文去哪个网站?2024最佳五款AI毕业论文学术网站

在2024年&#xff0c;AI技术在学术写作领域的应用已经变得越来越普遍。为了帮助学生和研究人员更高效地完成毕业论文的撰写任务&#xff0c;市场上涌现了许多优秀的AI论文写作工具。本文将重点推荐五款最佳的AI毕业论文学术网站&#xff0c;并特别强调千笔-AIPassPaper的优势。…

【应用开发三】 input子系统介绍

文章目录 1 名词解释2 输入设备编程框架2.1 input子系统2.2 读取数据流程2.3 input_event结构体2.3.1 type&#xff08;哪类事件&#xff09;2.2 code&#xff08;具体事件&#xff09;2.3 value&#xff08;数值&#xff09; 2.4 数据同步2.5 读取start input_event数据 1 名词…

【iOS】——YYModel源码总结

性能优化及优点 YYModel主要用于将JSON数据转换为模型对象&#xff0c;以及将模型对象转换为字典的库。相比于其他的数据转换库例如JSONModel&#xff0c;它更加的轻量级并且性能更高&#xff0c;因为它在很多地方做了优化&#xff1a; 通过CFDictionaryCreateMutable方法将数…

【数据结构与算法 | 灵神题单 | 二叉搜索树篇】力扣99, 1305, 230, 897

1. 力扣99&#xff1a;恢复二叉搜索树 1.1 题目&#xff1a; 给你二叉搜索树的根节点 root &#xff0c;该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下&#xff0c;恢复这棵树 。 示例 1&#xff1a; 输入&#xff1a;root [1,3,null,null,2] 输出&…

【UWB无线载波通信技术】史上最详细解说!!

UWB定位技术的人员定位系统源码&#xff0c;高精度人员定位系统&#xff0c;自主研发&#xff0c;最高定位精度可达10cm&#xff0c;全套源码合作&#xff01; 目录 简介 基本原理 技术指标 应用 uwb定位系统应用场景 一、‌室内定位与导航‌&#xff1a; 二、‌特定行业…

如何快速修改CSDN代码块或者主题的字体颜色

第一步登录你的CSDN账号然后点击你的头像 第二步点击下拉框中的“内容管理” 第三步&#xff0c;点击“博客设置” 第四步&#xff0c;点击“等级”选择喜欢的主题和颜色 第五步&#xff0c;选择代码块的主题和颜色 最后保存刷新就可以了。

sqlite数据库设计工具

下载 开发环境 VS2022 + Qt5.14.2 CMake修改 add_subdirectory(sqlite3-cmake) include_directories(${CMAKE_SOURCE_DIR}/sqlite3-cmake/src) target_link_libraries(${PROJECT_NAME} sqlite3) 效果 参考 https://github.com/sqlitebrowser/sqlitebrowser

莱卡相机sd内存卡格式化了怎么恢复数据

在数字化时代&#xff0c;相机已成为我们记录生活、捕捉瞬间的重要设备。而SD内存卡&#xff0c;作为相机的存储媒介&#xff0c;承载着我们的珍贵记忆和重要数据。然而&#xff0c;有时由于误操作、系统错误或其他原因&#xff0c;我们可能会不小心格式化SD内存卡&#xff0c;…

对商品分类系统的若干问题的思考

科学研究的目的就是研究事物的特征&#xff0c;并根据共同的特征加以分类 商品分类是商业&#xff0c;制造业中最普遍的活动&#xff0c;几乎所有的企业&#xff0c;电商平台都要对销售的商品&#xff0c;使用的原材料&#xff08;BOM&#xff09;进行分类和编号。 商品分类貌似…

电脑录屏方法,四个方法快速录屏!

在这个数字化时代&#xff0c;无论是教学分享、游戏直播还是软件教程制作&#xff0c;电脑录屏都成了我们日常生活中不可或缺的技能之一。但面对琳琅满目的录屏软件和复杂多样的操作界面&#xff0c;你是否也曾感到一头雾水&#xff1f;别担心&#xff0c;今天我们就来揭秘四个…

攻防世界--->EASYHOOK

做题笔记。 下载 查壳。 32ida打开。 进入main&#xff1a;&#xff08;该改的该&#xff09; 动调&#xff0c;第一遍&#xff0c;试试水&#xff1a;看看程序的状态。 运行。 发现我们的输入变成了另一种字符&#xff0c;并且还写了个文件。 我们对&#xff0c;input进行追…

Makefile的常用语法

1. makefile规则 目标&#xff1a;依赖 [tab]命令 或者 目标&#xff1a;依赖 &#xff1b;命令 【目标】&#xff1a;目标可以是一个文件/标签。可以有多个目标&#xff0c;多个目标之间用空格分开&#xff0c;支持通配符。 【依赖】&#xff1a;依赖可以是一个文件/目标…

【计算机网络】传输层协议UDP

目录 一、端口号1.1 端口号范围划分1.2 认识知名端口号 二、UDP协议2.1 UDP协议端格式2.2 UDP的特点2.3 UDP的缓冲区2.4 UDP使用注意事项2.5 基于UDP的应用层协议 一、端口号 传输层协议负责数据的传输&#xff0c;从发送端到接收端。端口号标识一个主机上进行通信的不同的应用…

力扣之1459.矩形面积

1. 1459.矩形面积 1.1 题干 表: Points ---------------------- | Column Name | Type | ---------------------- | id | int | | x_value | int | | y_value | int | ---------------------- id 是该表中具有唯一值的列。 每个点都用二维坐标 (x_value, y_value) 表示。 编…