如何在Python 3.7+中正确声明元类?代码报错求助
解决Python 3.7+中元类声明的问题
你碰到的这个错误,核心原因是用了Python 2时代的元类声明方式——在Python 3.7+里,__metaclass__这个类属性已经不再用来指定元类了,所以你的Meta元类根本没被实际应用到Test类上,自然field2也没被添加到类的属性里。
正确的元类声明方式(Python 3+)
在Python 3中,指定元类的标准写法是在类定义时,通过metaclass关键字参数传递:
class Meta(type): def __new__(mcs, name, bases, attrs): attrs2 = {'field2': 'Test'} attrs2.update(attrs) # Python 3里super()可以省略参数,写法更简洁 return super().__new__(mcs, name, bases, attrs2) # 用metaclass参数指定元类 class Test(object, metaclass=Meta): field1 = 10 test = Test() print(test.field1) # 输出:10 print(test.field2) # 输出:Test
为什么旧写法失效?
Python 2中,类内部定义__metaclass__属性的方式,是当时设计的元类指定逻辑,但Python 3重构了元类的实现机制,改为通过类定义时的关键字参数来传递,这样不仅逻辑更清晰,也和Python的参数传递习惯保持一致。
修改后的代码运行后,元类Meta的__new__方法会正常介入Test类的创建过程,把field2添加到类属性中,自然就能正常访问了。
内容的提问来源于stack exchange,提问作者Denis Steinman
相关产品推荐
相关产品推荐

