首页 > 其他分享 >为什么 super().__new__(cls, name, bases, dct) 中的 cls 是显式传递的,而不是像 self 那样隐式传递

为什么 super().__new__(cls, name, bases, dct) 中的 cls 是显式传递的,而不是像 self 那样隐式传递

时间:2024-12-09 18:10:12浏览次数:3  
标签:__ 元类 .__ name 传递 new cls

问题来源:为什么定义元类和自定义元类时,在调用父类的__new__方法时都是需要显式传递cls的,而__init__在调用父类__init__方法时就是隐式的。

# 自定义元类
class MyMeta(type):
    def __new__(cls, name, bases, dct):
        print(f"Creating class {name} using MyMeta")
        return super().__new__(cls, name, bases, dct)

    def __init__(cls, name, bases, dct):
        print(f"Initializing class {name} using MyMeta")
        super().__init__(name, bases, dct)
# 使用自定义元类创建类
class MyClass(metaclass=MyMeta):
    def __new__(cls, *args, **kwargs):
        print(f"Creating an instance of {cls.__name__}")
        instance = super().__new__(cls,*args, **kwargs)  # 调用父类的 __new__ 方法
        return instance

    def __init__(self, name):
        print(f"Initializing an instance of {self.__class__.__name__}")
        self.name = name

    def __call__(self):
        print(f"Instance of {self.__class__.__name__} is being called!")

# 实例化 MyClass
print("\n-- Step 1: Create an instance --")
obj = MyClass("Alice")

# 调用实例
print("\n-- Step 2: Call the instance --")
obj()

原因:这是因为__new__是静态方法,不依赖于实例调用,而依赖于类本身。 因此,Python 要显式地将 cls 传递给__new__方法。

那么为什么 cls 需要显式传递?

在元类中,cls 是动态决定的

在元类的 __new__ 方法中,cls 代表将要创建的类。
•  调用 super().__new__(cls, name, bases, dct) 时:
•  super() 调用的是父类(通常是 type)的 __new__ 方法。
•  cls 需要明确告诉 type.__new__ 它要创建哪个类。
•  type.__new__ 会根据 cls 创建一个类。

具体调用流程:
•  Python 调用元类的 __new__ 时,会显式传递 cls。
•  元类的 __new__ 需要将 cls 传递给 type.__new__,否则父类不知道该创建哪个类。

标签:__,元类,.__,name,传递,new,cls
From: https://www.cnblogs.com/hayaso/p/18595710

相关文章

  • 使用 Vyper 编写简易文字识别程序
    Vyper是一种Python风格的智能合约编程语言,主要用于Ethereum区块链的智能合约开发。尽管Vyper主要应用于智能合约领域,我们依然可以用它来实现一些基础的程序逻辑。这篇文章将展示如何用Vyper编写一个基本的文字识别程序,通过处理用户输入的简单特征字符串来“识别”对应的......
  • JOKER 前端框架:自带云端可视化 IDE 的创新利器
    一、框架概述在当今前端开发的多元化领域中,JOKER前端框架犹如一颗璀璨的明星,以其独特而强大的功能,为开发者开辟了一条高效、便捷的创新之路。JOKER不仅仅是一个普通的框架,它更是一个综合性的框架平台,旨在为所有可能的开发场景提供全方位、无死角的支持。其中,Joker.front作......
  • 缺失nw_elf.dll文件的系统错误:如何有效解决?
    在使用Windows操作系统时,有时会遇到系统提示“缺失nw_elf.dll文件”的错误。这个错误通常发生在启动某些应用程序或游戏时,导致程序无法正常运行。nw_elf.dll文件是一个动态链接库文件,它与Node-Webkit(或NW.js)框架相关,该框架基于Chromium和Node.js,用于开发基于HTML5、JavaScript......
  • wtsapi32.dll文件运行异常:Windows平台上的处理指南
    在使用Windows操作系统时,有时你可能会遇到一些与系统文件相关的错误,其中wtsapi32.dll文件运行异常就是一个较为常见的问题。wtsapi32.dll是Windows操作系统中的一个关键动态链接库(DLL)文件,它主要用于支持远程桌面协议(RDP)和其他终端服务相关的功能。当这个文件出现问题时,可能会导......
  • 渗透测试人员的 Nmap:漏洞扫描零基础入门教程,网络安全看这一篇就够了!
    此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用......
  • 用HubSpot免费托管,轻松建站无压力
    在数字化的时代,网站托管如同企业互联网战略中的一艘稳健航船,引领我们在信息的海洋中破浪前行。它不仅关乎企业网站能否在互联网的广阔天地间站稳脚跟,更直接牵动着客户的体验、品牌的塑造乃至业务的拓展。而HubSpot,不仅凭借其卓越的软件产品和服务赢得了各大企业的信赖与赞誉,......
  • 最常遭受网络钓鱼攻击的五大行业
    研究人员分析了2023年第三季度至2024年第三季度的网络钓鱼攻击,并确定了主题定制电子邮件所针对的五大行业,这些攻击通常利用姓名、电子邮件、电话号码或公司名称等个人信息来绕过安全措施。 采用编辑技术保护敏感信息,同时向客户提供可操作的情报,确保在不损害隐私的情况下......
  • TPM 2.0:安全固件的新标准
    得益于可信计算组(TCG)推出的全新TPM2.0规范,联网设备可以更好地抵御网络攻击,并且不太可能受到错误的攻击。制造商将可信平台模块(TPM)附加到设备上,以帮助用户和管理员验证其身份、生成和存储加密密钥以及确保平台完整性。在TPM规范更新之前,用户和管理员只能假设T......
  • leetcode543.二叉树的直径
    给你一棵二叉树的根节点,返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它们之间边数表示。示例1:输入:root=[1,2,3,4,5]输出:3解释:3,取路径[4,2,1,3]或......
  • 【保姆级教程】教你从零开始在飞牛云fnOS搭建WordPress网站并实现公网访问
    文章目录前言1.Docker下载源设置2.Docker下载WordPress3.Docker部署Mysql数据库4.WordPress参数设置5.飞牛云安装Cpolar工具6.固定Cpolar公网地址7.修改WordPress配置文件8.公网域名访问WordPress前言在数字化浪潮中,网站搭建已成为个人和企业在推广自身品......