【问题标题】:How to call variable of the upper class in inner class?如何在内部类中调用上层类的变量?
【发布时间】:2019-08-23 05:41:41
【问题描述】:

我必须将上层类定义的变量调用到内部类。

代码

class outer:
  def __init__(self):
    self.Out = 'out'
    self.In = self.inner()
  class inner:
    def __init__(self):
      self.InOut = outer.Out

c = outer()

错误信息

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in __init__
  File "<stdin>", line 7, in __init__
AttributeError: type object 'outer' has no attribute 'Out'

【问题讨论】:

  • Outouter 的实例属性。 inner 没有 outer 的实例来获取属性:您正在尝试从没有它的类中读取它。您可以将它传递给inner 的init 方法。不太清楚你的目标是什么,或者为什么你在另一个类中有一个类。
  • 类也应该以大写字母开头。属性不应该。

标签: python class inner-classes


【解决方案1】:
  • 要创建Inner class 的新实例,您应该在前面加上Outer 类名,即Outer.Inner()
  • 你应该在引用它之前定义Inner类。
  • Outer.__init__中,您可以将容器对象传递给Inner class创建的实例,即Outer.Inner(self),它将作为outer的参数传递给Inner.__init__方法。
class Outer:
  class Inner:
    def __init__(self, outer):
      self.in_out = outer._out
      print(self.in_out)

  def __init__(self):
    self._out = 'out'
    self._in = Outer.Inner(self)

c = Outer()

【讨论】:

  • 这里,最后一个self引用了Outer。
【解决方案2】:

在您的情况下,outer.Out 是在实例上下文 (self.Out) 中启动该属性时尝试访问类属性(在类上下文中)。这是两种不同的上下文。

如果您仍然需要定义一个可以访问父类实例的嵌套类 - 将 Outer 实例传递给内部 Inner 构造函数作为参考:

class Outer:
  class Inner:
    def __init__(self, parent):
      self.InOut = 'inner ' + parent.Out

  def __init__(self):
    self.Out = 'out'
    self.In = Outer.Inner(self)


c = Outer()
print(c.In.InOut)   # inner out

【讨论】:

  • 可以通过以上方式解决。虽然我不需要定义嵌套类,但我仍然有同样的错误。这是否意味着我发布的代码应该移动到外部类的上侧的内部类?
  • @NokiLee,它应该可以工作。你用的是什么python版本?
  • 这是 Python 3.7.4。对不起,当我没有使用嵌套类时,我忘了写 parent。
  • @Samha',你错了 - c.In.InOut 显然不能被表述为“静态上下文”
  • @RomanPerekhrest 你说得对,我因为在 CAPS 中使用了变量而感到困惑。
猜你喜欢
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 2011-06-08
  • 2019-11-19
  • 2013-07-08
相关资源
最近更新 更多