我有这样的代码:
class Attributes(object):
class __metaclass__(type):
def __init__(self, cls_name, cls_bases, cls_dict):
# super(Attributes.__metaclass__, self) # NameError: global name 'Attributes' is not defined
super(__metaclass__, self).__init__(
cls_name, cls_bases, cls_dict)给出
NameError: global name '__metaclass__' is not defined为什么在外部作用域中找不到__metaclass__变量?
发布于 2013-10-24 16:19:29
试试这个吧
super(Attributes.__metaclass__, self).__init__(cls_name, cls_bases, cls_dict)发布于 2013-10-24 17:27:44
在创建类时,只有它的名称是可见的。在完成类的创建之前,它的内容还不存在。因此,类内部的部分在创建期间不能访问类的任何字段。因此,您需要使用完全限定名来表示您想要访问类的字段
您当前正在创建一个类SimpleModel,在这样做的同时,您正在创建一个类Attributes,并且在这样做的同时创建了一个类__metaclass__。因为在执行此操作时,类SimpleModel还不存在,所以__init__方法还不是任何现有内容的一部分。它首先被创建,然后将成为类__metaclass__的一部分。因此,它不能知道标识符__metaclass__。而且由于__metaclass__也永远不会成为全局变量,所以当被调用时,这个标识符是不能被知道的。
这就是为什么此时您的作用域中没有__metaclass__的原因,但是当稍后调用__init__时,通过全局作用域只有一个SimpleModel可用,因此您可以基于它命名:SimpleModel.Attributes.__metaclass__。
发布于 2013-10-24 16:47:07
看起来答案是这样的:
方法的外部作用域不是类体,而是包含类或模块的外部函数。
这就是为什么在这种情况下
class Test():
attr_1 = 'smth'
def a_method(self):
attr_1 # not visible on this lineattr_1在方法Test.a_method中不可见
解决方案是在全局级别定义元类:
class AttributesMeta(type):
def __init__(self, cls_name, cls_bases, cls_dict):
super(__metaclass__, self).__init__(
cls_name, cls_bases, cls_dict)
class Attributes(object):
__metaclass__ = AttributesMetahttps://stackoverflow.com/questions/19560017
复制相似问题