下面的代码不能编译;它说
NameError: name 'fields' is not defined
在最后一行。是因为__new__
直到到达fields
赋值后才被调用?我该怎么办?在
class Meta(type):
def __new__(mcs, name, bases, attr):
attr['fields'] = {}
return type.__new__(mcs, name, bases, attr)
class A(metaclass = Meta):
def __init__(self, name):
pass
class B(A):
fields['key'] = 'value'
编辑:
我发现这不是时间问题,而是名字隐藏的问题。如果我改为写A.fields
,效果很好。在
我想知道为什么我不能使用fields
或{
fields['key'] = 'value'
在元类机制启动之前运行。在当python命中
class
语句时,它将进入一个新的本地命名空间。在它计算
var1 = 'bar'
语句。这相当于locals()['var1'] = 'bar'
然后计算
def foobar
语句。这相当于locals()['var'] = the result of compiling the function
然后,然后将
locals()
,以及类名、继承的类和元类传递给元类__new__
方法。在这个例子中,元类只是type
。然后它退出新的本地命名空间,并将从
__new__
返回的类对象粘贴到名为foo
的外部命名空间中。当您使用}来执行。在
A.fields
时,您的代码可以工作,因为类A
已经创建,并且上面的过程已经在A
中的Meta
安装{不能使用
super().fields
,因为在super运行时类名B
没有定义为传递给super。也就是说,您需要它是super(B).fields
,但是B
是在类创建之后定义的。在更新
这里有一些代码可以根据您对我对问题的评论的回复来执行您想要的操作。在
^{pr2}$相关问题 更多 >
编程相关推荐