如何引用嵌套的Python数据类



关于类似问答的注意事项;作为:

  • 这个问题在Nested Python类中没有得到解决。类需要访问封闭类中的变量,该类处理的是一个"父";并且嵌套";"孩子";类,并且不寻址@dataclasses.dataclass
  • 这个问题在Python中得到了解决——从其他内部类引用内部类。我认为接受的答案中的代码是有效的,但在使用普通类时,在下面的评论后仔细检查表明它不是有效的

我正试图在另一个类中对多个Python@dataclass装饰的类进行简单的嵌套,并让后面的类引用以前的类。如果我根本不嵌套它们,它们就会按预期工作,能够将定义的第一个类包含在第二个类中的对象中:

from dataclasses import dataclass, field
@dataclass
class A:
z:int = field(default=0)
@dataclass
class B:
a:A = field(default=A(z=1)) ### Object that is class A is included in class B
b = B(a=A(z=3))
print(f'b = B(a=A(z=3)); b.a.z={b.a.z}; b={b}')

但如果我试图在另一个类(在这种情况下,不是数据类)内部做同样的事情;B";类不能看到";A";班在下面的代码中,将a定义为A的类型失败,并出现NameError:;名称CCD_ 5未被定义";。我试过A和C.A,都不管用。

注意,C类中的其他函数可以很好地同时看到A和B,只是在数据类B内部看不到数据类A。

class C:
@dataclass
class A:
z:int = field(default=0)
@dataclass
class B:
a:A = field(default=A(z=1)) ### NameError: name 'A' is not defined
def __init__(self):
self.b = C.B(a=C.A(z=3))
def print_info(self):
print(f'b = C.B(a=C.A(z=3)); b.a.z={self.b.a.z}; b={b}')
c = C()
c.print_info()

但是,如果我将这些转换为普通的Python类,它在嵌套的情况下工作:

经过重新检查,发现这在普通课堂上也被打破了(根据下面的评论)。

奇怪的是,如果一个人在数据类B中嵌套数据类A,而B仍在类C中,它确实有效——B可以直接访问A,但类C中没有其他东西可以直接访问A.

问题

是否可以定义嵌套的数据类,让后面的数据类在同一级别访问前面的数据类?如果是,如何?

据我所知,这是由于类定义的语义——强调我的:

然后在新的执行框架中执行类的套件,使用新创建的本地命名空间和原始全局命名空间。(通常,该套件主要包含函数定义。)当类的套件完成执行时,其执行框架将被丢弃,但其本地命名空间将被保存。

也就是说,任何类定义都只有模块全局命名空间(在这种情况下,它还不包含C,因为它的套件尚未完成执行)和一个新的空本地命名空间。

编辑

基于以上,这个可以一起被黑客攻击来工作,但我真的不会这么做。。。

from dataclasses import dataclass, field

class C:
@dataclass
class A:
z: int = field(default=0)
globals()["A"] = A  # "and the original global namespace..."
@dataclass
class B:
a: A = field(default=A(z=1))
def __init__(self):
self.b = C.B(a=C.A(z=3))
def print_info(self):
print(f"{self.b.a.z=}")

c = C()
c.print_info()