python - python中类内部类的命名空间

标签 python

我试图理解 python 2.7 中命名空间的嵌套。

考虑以下无效代码:

class c(object):
  def debug(self):
     print globals(),locals()
     print x,y

class a(object):
   x=7 
   def __init__(self):
     self.y=9
   class b(object):
      def debug(self):
         print globals(),locals()
         print x,y
   class d(c):
      pass

如何从调用中访问变量 x 和 y

a().b().debug()
a.b().debug()
a().d().debug()
a.d().debug()

他们似乎都看不到 x 和 y。

讨论后编辑,似乎我想要的(避免引用全局变量)只能通过显式扩展嵌套类的信息来实现。例如

class a(object):
   #
   @classmethod
   def _initClass(cls):
     for v in dir(cls):
       if type(cls.__dict__[v])==type:
         setattr(cls.__dict__[v],'vader',cls)   
   #
   x=7 
   class b(object):
     def debug(self):
       print b.vader.x
   class d(c):
     pass

 a._initClass()

甚至这种技术对于访问实例变量似乎也没有用,正如 a().d().debug 序列中预期的那样。

最佳答案

class 对象创建作用域;类主体只执行一次并被丢弃,本地命名空间产生类属性。类体从不参与嵌套范围;在解析非本地名称时,它们会被完全忽略。

因此,您的 x = 7 不是嵌套的 b 类(或其方法)可以访问的名称。相反,它是 a 上的一个类属性。访问 a.x 将起作用。 y 是一个实例属性,您必须引用该实例才能在其他任何地方访问它。

请注意,这也适用于 class b;它现在是a 上的一个类属性,就像x 是一个类属性一样。

除了如何引用类对象之外,您的类 b 没有什么特别之处。仅仅因为您创建了 a 的实例并不意味着 b 有任何特权访问它; a().b() 不会在实例之间创建关系。你可以这样做:

b = a.b
b_instance = b()

并没有什么区别。你甚至可以这样做:

a.b.a = a
a.b.a()

世界不会崩溃! (喜欢那个)。

关于python - python中类内部类的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26532730/

相关文章:

javascript - 通过javascript使photoshop运行系统命令

python - 在 Django 中验证上传文件类型

python - 删除其他列中出现的单词,Pandas

python - Django manage.py 测试

python - 如何过滤列表中的列表?

python - 向日期时间添加秒数

python - 使用python提取回归系数

python - 对列表中的奇数进行排序

python - 我如何了解运行此 Python 程序时遇到的错误?

python - 使用变量更新列数据