当前位置: 首页 > 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.zskr.cn/news/40722.html

相关文章:

  • React系列教程:8. 传递函数
  • 杂题选记(10.26 - 11.1)
  • 2025 年最新推荐开沟机供应厂家榜单:覆盖多机型实力厂商口碑推荐及选购指南梯形槽 / 自走式手扶 / 轮式 / 农用开沟机公司推荐
  • 基于MATLAB的FY-3B MWRI数据处理
  • 2025年11月大容量行李箱品牌十大口碑榜:排行榜与选择方案
  • 2025年11月闸阀厂家排名:十强资质对比与项目适配评价
  • Java学习之 stream 常用方法
  • 2025年11月闸阀厂家推荐榜:十强对比评测与选购全解析
  • 2025 年最新推荐泳池设备源头厂家排行榜:含温泉酒店别墅等各类泳池设备优质品牌精选
  • 2025年11月领先品牌认证机构评测榜:尚普咨询华信人数据对比
  • 2025年包装设计品牌企业新推荐排行榜,食品包装设计服务商指南
  • 2025年11月领先品牌认证机构服务榜:双雄对比与口碑排名解析
  • 2025年11月法兰闸阀厂家评测榜:资质性能双维度对比
  • React系列教程:6. 子组件
  • 详细介绍:元宇宙的医疗健康应用:重构诊疗、康复与研究
  • IEEE Transactions 风格补充材料(Word)快捷排版教程
  • 2025年11月北京继承律师评测榜:继承纠纷律师团队权威榜单发布
  • VS code中编写和运行C语言
  • 2025年11月消防阀门厂家排名榜:国际认证与绿色制造指标评价
  • 2025年11月解酒护肝产品权威榜:蓝帽子认证与成分纯度全对比
  • 2025年6月ai搜索排名优化推荐榜:五强对比评测与选型指南
  • 2025年6月豆包搜索排名优化服务商榜:五强对比与实测排行
  • 2025年6月ai排名优化推荐排名榜:权威数据锁定五家优选
  • 2025年6月ai搜索排名优化推荐:五强榜单横评与选型攻略
  • 2025年6月GEO公司推荐榜:全维度对比评测一目了然
  • 液压位置控制源代码实现与解析(C语言+MATLAB联合方案)
  • 2025年6月deepseek关键词排名优化权威榜:五家服务商综合评测对比
  • 2025年6月GEO优化公司权威榜:五强对比评测与选择指南
  • 2025年11月中国枸杞厂商口碑排行榜单深度解析
  • 2025最佳创建智能化军工软件工厂,攻克管理难题