当前位置: 首页 > news >正文

误解对象的“引用名”跟对象的“名称属性”(`__name__`)引发的一则错误

class MyMetaclass(type):def __new__(cls,*args,**kwargs):print("MyMetaclass中的new被执行")return super().__new__(cls,*args,**kwargs)def __init__(self,*args,**kwargs):print("MyMetaclass中的init被执行")self.__instance=Nonedef __call__(self,*args,**kwargs):print("MyMetaclass中的call被执行")if self.__instance is None:self.__instance=super().__call__()return self.__instance
#下面是由自定义元类构造出来的普通类,父类是object
a=MyMetaclass("MClass",(object,),dict())
MClass()#报错

MClass()为什么报错?

MClass() 报错的核心原因是:Python 找不到名为 MClass 的引用,因为你创建的类对象并没有绑定到 MClass 这个引用名上。

具体拆解:

  1. 类的创建过程
    当你执行 a = MyMetaclass("MClass", (object,), dict()) 时,确实通过元类 MyMetaclass 创建了一个类对象。

    • 这个类对象的“名称属性”(__name__)是 "MClass"(由第一个参数指定,仅用于标识类的名字)。
    • 但这个类对象被绑定到了 a 这个引用名上(即 a 指向这个类对象)。
  2. 为什么 MClass() 会报错?
    Python 中调用类(如 XXX())时,会去查找名为 XXX 的引用,看它是否指向一个类对象。

    • 你创建的类对象虽然“名称属性”是 "MClass",但并没有任何引用名叫做 MClass(唯一的引用是 a)。
    • 因此,当你写 MClass() 时,Python 会报 NameError: name 'MClass' is not defined——因为找不到名为 MClass 的引用。
  3. 举个生活例子
    假设你买了一辆车,车的出厂名称是“特斯拉”(对应类的 __name__ 属性),但你给它上的车牌是“京A12345”(对应引用名 a)。

    • 如果你站在路边喊“特斯拉,启动!”,车不会理你(因为没有这个“标识”)。
    • 但喊“京A12345,启动!”,车才会响应(因为“京A12345”是绑定到这辆车的标识)。

如何解决?

让引用名与类的“名称属性”一致即可:

# 将类对象绑定到 MClass 这个引用名上
MClass = MyMetaclass("MClass", (object,), dict())
MClass()  # 此时不会报错,因为 MClass 是有效的引用名

总结:

类的“名称属性”(__name__)只是类的一个标识字符串,而引用名是 Python 查找对象的“钥匙”。二者可以不同(如 a 指向名称为 MClass 的类),但只有通过有效的引用名才能调用类。

http://www.jsqmd.com/news/32119/

相关文章:

  • React系列教程:8. 传递函数
  • 杂题选记(10.26 - 11.1)
  • P3953 [NOIP 2017 提高组] 逛公园 题解
  • 用“引用名”替代“变量名”来描述指向对象的标识,更为准确!
  • 2025 年最新推荐开沟机供应厂家榜单:覆盖多机型实力厂商口碑推荐及选购指南梯形槽 / 自走式手扶 / 轮式 / 农用开沟机公司推荐
  • 2025年11月长途旅行行李箱品牌十大选择榜:权威榜单与数据佐证推荐
  • 2025 年镀锌卷板厂家最新推荐排行榜:聚焦实力企业,揭秘定制化服务优势及优质产品选购方向无花镀锌卷板 / 高锌层镀锌卷板 / 批发镀锌卷板公司推荐
  • 2025年11月长途旅行行李箱十大品牌选择榜:知名主流参数全解析
  • 2025.11 做题记录
  • 2025 年 11 月外墙仿石漆厂家推荐排行榜,真石漆,水包砂,质感涂料,仿石涂料优质品牌公司推荐
  • 2025 年 11 月耐污仿石漆厂家推荐排行榜,外墙耐污仿石漆,墙面耐污仿石漆,建筑涂料耐污仿石漆公司推荐
  • 2025 年 11 月水包水仿石漆厂家推荐排行榜,外墙水包水仿石漆,多彩水包水仿石漆,质感水包水仿石漆公司推荐
  • 2025年11月轻便行李箱品牌十大排行榜:全维度解析与避坑建议
  • 2025 年 11 月防霉仿石漆厂家推荐排行榜,外墙防霉仿石漆,室内防霉仿石漆,水性防霉仿石漆,高效防霉仿石漆公司推荐
  • 移动应用APP开发搭建自动化测试框架经验分享
  • 2025年11月大容量行李箱品牌十大对比榜:知名型号数据化评测
  • React系列教程:7. 条件渲染
  • 基于MATLAB的FY-3B MWRI数据处理
  • 2025年11月大容量行李箱品牌十大口碑榜:排行榜与选择方案
  • 2025年11月闸阀厂家排名:十强资质对比与项目适配评价
  • 2025年能注册公司代办的公司哪家好?
  • 【权威发布】国产设备采购必看!工信部安全可靠测评最新结果汇总(附指南).v2.251105
  • Java学习之 stream 常用方法
  • 2025年11月闸阀厂家推荐榜:十强对比评测与选购全解析
  • 真实迁移案例:从 Azkaban 到 DolphinScheduler 的选型与实践
  • 2025 年最新推荐泳池设备源头厂家排行榜:含温泉酒店别墅等各类泳池设备优质品牌精选
  • 2025年11月领先品牌认证机构评测榜:尚普咨询华信人数据对比
  • 2025年11月脸部泛红产品推荐榜:泛红舒缓精华实测对比榜
  • 2025年11月领先品牌认证机构服务榜:尚普咨询集团华信人对比评价
  • 2025年包装设计品牌企业新推荐排行榜,食品包装设计服务商指南