我试图理解 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/