Python 从另一个嵌套类访问属性

Python 从另一个嵌套类访问属性,python,python-3.x,Python,Python 3.x,我希望实现类似于此结构的目标: class Outer: class A: foo = 1 class B: def __init__(self): self.bar = A.foo Outer.B().bar # ==> 1 但这一点在某些情况下是行不通的 NameError: name 'A' is not defined 我甚至不确定我是否理解为什么asA在(我认为)范围内 你能帮我澄清一下为什么这不起

我希望实现类似于此结构的目标:

class Outer:
    class A:
        foo = 1

    class B:
        def __init__(self):
            self.bar = A.foo

Outer.B().bar  # ==> 1
但这一点在某些情况下是行不通的

NameError: name 'A' is not defined
我甚至不确定我是否理解为什么as
A
在(我认为)范围内

你能帮我澄清一下为什么这不起作用,以及我如何解决它吗?

名称只能在
全局单元格、
局部单元格和非局部单元格中查找(但这里没有闭包)

<> >写<代码>外,而不是<代码> a <代码>,或考虑制作<代码>外部<代码>一个模块。

名称仅在 >代码>本地语言< /COD>和非本地单元格中查找(但这里没有一个闭包)。
<> >代码< >代码> > <代码> > <代码>,或考虑制作<代码>外部< /代码>一个模块。

如果使用<代码>外。A.foo < /代码> .< /p> < p>如果使用<代码>外。A.foo < /代码>

< p>就像你为<代码>外(b)所做的.Bar < /代码>:对<代码>.foo

就像您对
外部.B().bar所做的那样:对
self.bar=Outer.A().foo
Python中的内部类没有访问封闭类成员的权限。A不在您所说的B的范围内。A和B都在外部范围内,但他们彼此不认识。因此,您的问题有一个可能的解决方案:

class Outer:
    class A:
        foo = 1

    class B:
        def __init__(self, class_a):
            self.bar = class_a.foo

    def __init__(self):
        self.a = self.A()
        self.b = self.B(self.a)


print(Outer.A.foo) # 1
print(Outer.B.bar) # AttributeError: type object 'B' has no attribute 'bar'

outer = Outer()
print(outer.a.foo)  # 1
print(outer.b.bar)  # 1

Python中的内部类没有访问封闭类成员的权限。A不在您所说的B的范围内。A和B都在外部范围内,但他们彼此不认识。因此,您的问题有一个可能的解决方案:

class Outer:
    class A:
        foo = 1

    class B:
        def __init__(self, class_a):
            self.bar = class_a.foo

    def __init__(self):
        self.a = self.A()
        self.b = self.B(self.a)


print(Outer.A.foo) # 1
print(Outer.B.bar) # AttributeError: type object 'B' has no attribute 'bar'

outer = Outer()
print(outer.a.foo)  # 1
print(outer.b.bar)  # 1

不,类作用域不创建封闭作用域。这就是为什么在可以使用
a
的方法中,必须使用
Outer.a
,就像在
B中一样。但是为什么一开始就使用嵌套类呢?这不是Python中常见的模式。。。它提供了什么优势?@juanpa.arrivillaga好的,我没有意识到类的作用域是不同的。我同意这不是一个非常常见的模式,我只是第一次在这里使用它,基本上我有两个非常小的助手类(主要是类属性的“容器”),我认为不值得将其转移到模块中。另外,这两个小类并不打算成为公共接口的一部分。不,类作用域不会创建封闭作用域。这就是为什么在可以使用
a
的方法中,必须使用
Outer.a
,就像在
B中一样。但是为什么一开始就使用嵌套类呢?这不是Python中常见的模式。。。它提供了什么优势?@juanpa.arrivillaga好的,我没有意识到类的作用域是不同的。我同意这不是一个非常常见的模式,我只是第一次在这里使用它,基本上我有两个非常小的助手类(主要是类属性的“容器”),我认为不值得将其转移到模块中。另外,这两个小类并不打算成为公共接口的一部分。事实上,非常简单,我最初认为Outer不可用,因为类尚未创建。
Outer
不适用于在类范围内执行的代码。它可用于在函数范围内执行的代码,因为函数只在稍后执行。还要注意的是,
\uuu类
是存在的,但它主要用于
重新加载
或复制粘贴的代码以防止打字错误。事实上,非常简单,我最初认为Outer将不可用,因为类尚未创建。
Outer
不适用于在类范围内执行的代码。它可用于在函数范围内执行的代码,因为函数只在稍后执行。还要注意,
\uuu class\uuu
是存在的,但它主要用于
重新加载
或复制粘贴的代码以防止打字错误。