首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在外部类范围内找不到变量

在外部类范围内找不到变量
EN

Stack Overflow用户
提问于 2013-10-24 15:49:42
回答 3查看 235关注 0票数 3

我有这样的代码:

代码语言:javascript
复制
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)

给出

代码语言:javascript
复制
NameError: global name '__metaclass__' is not defined

为什么在外部作用域中找不到__metaclass__变量?

EN

回答 3

Stack Overflow用户

发布于 2013-10-24 16:19:29

试试这个吧

代码语言:javascript
复制
super(Attributes.__metaclass__, self).__init__(cls_name, cls_bases, cls_dict)
票数 2
EN

Stack Overflow用户

发布于 2013-10-24 17:27:44

在创建类时,只有它的名称是可见的。在完成类的创建之前,它的内容还不存在。因此,类内部的部分在创建期间不能访问类的任何字段。因此,您需要使用完全限定名来表示您想要访问类的字段

您当前正在创建一个类SimpleModel,在这样做的同时,您正在创建一个类Attributes,并且在这样做的同时创建了一个类__metaclass__。因为在执行此操作时,类SimpleModel还不存在,所以__init__方法还不是任何现有内容的一部分。它首先被创建,然后将成为类__metaclass__的一部分。因此,它不能知道标识符__metaclass__。而且由于__metaclass__也永远不会成为全局变量,所以当被调用时,这个标识符是不能被知道的。

这就是为什么此时您的作用域中没有__metaclass__的原因,但是当稍后调用__init__时,通过全局作用域只有一个SimpleModel可用,因此您可以基于它命名:SimpleModel.Attributes.__metaclass__

票数 1
EN

Stack Overflow用户

发布于 2013-10-24 16:47:07

看起来答案是这样的:

方法的外部作用域不是类体,而是包含类或模块的外部函数。

这就是为什么在这种情况下

代码语言:javascript
复制
class Test():
    attr_1 = 'smth'
    def a_method(self):
        attr_1  # not visible on this line

attr_1在方法Test.a_method中不可见

解决方案是在全局级别定义元类:

代码语言:javascript
复制
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__ = AttributesMeta
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19560017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档