python:元类中的uu new_uu的计时

2024-09-23 00:18:19 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码不能编译;它说

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或{}。在


Tags: 代码namefieldsnewisdeftypenot
1条回答
网友
1楼 · 发布于 2024-09-23 00:18:19

fields['key'] = 'value'在元类机制启动之前运行。在

class foo(object):
    var1 = 'bar'

    def foobar(self):
        pass

当python命中class语句时,它将进入一个新的本地命名空间。在

  1. 它计算var1 = 'bar'语句。这相当于locals()['var1'] = 'bar'

  2. 然后计算def foobar语句。这相当于locals()['var'] = the result of compiling the function

  3. 然后,然后locals(),以及类名、继承的类和元类传递给元类__new__方法。在这个例子中,元类只是type

  4. 然后它退出新的本地命名空间,并将从__new__返回的类对象粘贴到名为foo的外部命名空间中。

当您使用A.fields时,您的代码可以工作,因为类A已经创建,并且上面的过程已经在A中的Meta安装{}来执行。在

不能使用super().fields,因为在super运行时类名B没有定义为传递给super。也就是说,您需要它是super(B).fields,但是B是在类创建之后定义的。在

更新

这里有一些代码可以根据您对我对问题的评论的回复来执行您想要的操作。在

^{pr2}$

相关问题 更多 >