首页 > 编程语言 >Python 元类机制的工作流程及参数调用的不同

Python 元类机制的工作流程及参数调用的不同

时间:2024-12-01 14:43:22浏览次数:10  
标签:__ 调用 Python 元类 init bases new dct cls

class Mymeta(type):
    def __new__(cls, name, bases, dct):
        print(f'Mymeta.__new__: cls={cls}, id(cls)={id(cls)}')
        return super().__new__(cls, name, bases, dct)

    def __init__(cls, name, bases, dct):
        print(f'Mymeta.__init__: cls={cls}, id(cls)={id(cls)}')
        super().__init__(name, bases, dct)
type元类机制会调用__call__方法,执行__new__,再执行__init__

1. Python 元类机制的工作流程

在元类的上下文中,__new__ 和 __init__ 的调用顺序和逻辑如下:
	1.	调用 __new__:
	•	__new__ 的任务是 创建类对象。
	•	此时,name、bases 和 dct 描述的是类的定义信息。
	•	返回值是类对象(如 MyClass)。
	2.	调用 __init__:
	•	__init__ 的任务是对 __new__ 创建的类对象进行 初始化。
	•	此时,name、bases 和 dct 仍然是类的定义信息。

虽然 __new__ 和 __init__ 的参数(name, bases, dct)看起来是相同的,但它们在调用时所操作的 cls 对象不同:
	•	在 __new__ 中,cls 是元类本身(如 Mymeta),因为 __new__ 是由元类调用,用于创建类对象。
	•	在 __init__ 中,cls 是刚刚通过 __new__ 创建的类对象(如 MyClass),因为 __init__ 的任务是初始化这个类对象。

cls 的值不同是关键

	•	在 __new__ 中:
	•	cls 是元类 Mymeta,因为它负责 创建类对象。
	•	在 __init__ 中:
	•	cls 是通过 Mymeta.__new__ 创建出来的类对象(如 MyClass)。
	•	__init__ 的任务是初始化 MyClass。

标签:__,调用,Python,元类,init,bases,new,dct,cls
From: https://www.cnblogs.com/hayaso/p/18579789

相关文章

  • Python.task3
    Python.task3数据类型数字(intfloatcomplex)bool字符串序列元组字典集合字符串不可以修改内容str.replace(str1,str2):替换得到新字符串str.split(strx):分隔str.strip(strx):移除序列:list[]list.(index):取出对应下标,负数为倒着数list.append(x):追加一个元素......
  • 「Py」模块篇 之 Python常见模块介绍
    ✨博客主页何曾参静谧的博客(✅关注、......
  • Python中的for循环
    for循环的基本语法:1.for循环里面的变量名可以自己定义2.for循环结构是用于遍历后面的序列:序列可以为(字符串、列表、元组、集合以及字典)类型数据的遍历for自己定义的临时变量in序列:代码语句...eg:num="01234"foriinnum:print(i)输出结果为:01234一:ra......
  • Python数据爬取处理可视化,手把手全流程教学
    这篇博客中,选取openjudge网站上“百练”小组中的用户答题数据,作为材料进行教学目录爬取主页面内容主页面内容提取需求数据爬取数据处理数据分析网站地址:http://bailian.openjudge.cn/使用到的Python包:requests、pandas、re、BeautifulSoup、time、matplotlib、seaborn爬......
  • python毕设 jspm基于的幼儿园管理系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于幼儿园管理系统的研究,现有研究主要以传统管理模式为主,专门针对基于jspm的幼儿园管理系统的研究较少。在国内外,幼儿园管理正朝着信......
  • python毕设 动漫推荐系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于动漫推荐系统的研究,现有研究主要以基于内容或传统协同过滤算法为主。例如在[2]中提到现有的动漫推荐系统大多采用基于内容或基于......
  • 使用python构造含有时间序列与对应的乘客数量
    在Python中,你可以使用`pandas`库来构造一个含有时间序列与对应乘客数量的数据结构。`pandas`提供了非常方便的`DatetimeIndex`来处理时间序列数据。要构造一个含有时间序列与对应乘客数量的数据集,可以使用Python的pandas库。下面是一个示例代码:importpandasaspd#创建......
  • python毕设超市销售系统的设计与实现程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于超市销售系统的设计与实现问题的研究,现有研究主要以大型商业管理系统涵盖超市部分为主,专门针对Python实现超市销售系统的研究较少......
  • 蓝桥杯备考冲刺必刷题(Python) | 548 时间加法
    学习Python从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。附上汇总贴:蓝桥杯备考冲刺必刷题(Python)|汇总-CSDN博客【题目描述】现在时间是a点b分,请问t分钟后,是几点几分?【输入】输入的第一行包含一个整数a。第二行包含一个整数b.第三行包含一个整数t......
  • 蓝桥杯备考冲刺必刷题(Python) | 760 数的计算
    学习Python从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。附上汇总贴:蓝桥杯备考冲刺必刷题(Python)|汇总-CSDN博客【题目描述】输入一个自然数n(n≤1000),我们对此自然数按照如下方法进行处理:1.不作任何处理;2.在它的左边加上一个自然数,但该自然数不能超......