【发布时间】:2021-12-10 15:07:16
【问题描述】:
类似问答的注意事项:
-
Nested Python class needs to access variable in enclosing class 没有解决这个问题,它处理的是“父”类和嵌套的“子”类之间的关系,也没有解决
@dataclasses.dataclass类。 - Python - reference inner class from other inner class 解决了这个问题。我认为那里接受的答案中的代码有效,但是在使用普通类时,在下面的评论后仔细检查表明它不是。
我正在尝试在另一个类中对多个 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:“名称A 未定义”。我试过 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 类,它可以在嵌套情况下工作:
重新检查,事实证明这在普通课程中也被破坏了(根据下面的评论)。
奇怪的是,如果将数据类 A 在数据类 B 中嵌套,而 B 仍在类 C 中,它确实可以工作 - B 可以直接访问 A,但 C 类中的其他任何内容都不能直接访问 A .
问题
是否可以定义嵌套数据类,让后面的数据类在同一级别访问早期的数据类?如果有,怎么做?
【问题讨论】:
-
"Flat is better than nested." - The Zen of Python - 我看不出在这里嵌套类的充分理由。另外,请注意,您在这两种情况下所做的是在
B的所有实例之间共享一个A实例。这可能不是您想要的,因为这些不是frozen数据类。 -
另外,如果您从嵌套数据类示例中删除
@dataclass装饰器,您会发现它仍然会引发 NameError,因此这与数据类无关......跨度> -
@AKX 在我“相当复杂”的真实世界代码中,将它们嵌套以获得功能分组感觉是正确的做法,但我确实可以让它们至少在每个模块中保持平坦。关于 NameError - 你是对的!我把文件的布局搞砸了,如果我把它剪成那个例子,它也坏了。
-
模块非常适合功能分组。我认为标准库中没有很多嵌套类(如果有的话)......
-
基于我在正常课程上的错误,它是stackoverflow.com/q/42185472/6501141的重复,投票重新关闭它。您的回答确实增加了一些在问答中没有的清晰度。谢谢!
标签: python python-3.x class python-dataclasses