gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:59:52 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com