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
我甚至不确定我是否理解为什么asA
在(我认为)范围内
你能帮我澄清一下为什么这不起作用,以及我如何解决它吗?名称只能在全局单元格、局部单元格和非局部单元格中查找(但这里没有闭包)
<> >写<代码>外,而不是<代码> 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
是存在的,但它主要用于重新加载
或复制粘贴的代码以防止打字错误。