嵌套 classes:从内部访问外部 class 的方法

Nested classes: Accessing the methods of the outer class from the inner one

假设您有两个 class,AB。 Class B 在 class A 内部定义。我想在内部 class 内部访问外部 class 的变量和方法。这里的代码是一个玩具示例,但具有我想要演示的要点:

class A:
  a = 'even'
  b = 'odd'
  class B:
    def __init__(self, n):
      if n%2 == 0: self.num = a
      if n%2 == 1: self.num = b
      self.description = A.desc()

  def __getitem__(self, i):
    return self.B(i)

  def desc(self):
    return a + '-' + b

>>> c = A()
>>> d = c[4]
>>> TypeError: unbound method desc() must be called with A instance as first argument (got nothing instead)

这里方法 desc 对 class A 的变量做了一些工作并产生了输出。 Class A 已正确初始化,您可以访问变量 ab,即使您没有定义 description,即使是从内部范围多变的。但是,我找不到调用外部范围 class 方法 desc 的方法。不实例化class A 是否可以在B中使用方法desc

关于我为什么使用这种模式的解释: 我程序中的变量 ab 相当大。我只需要初始化它们一次。另外,我不希望这些变量在程序中四处浮动,而只能被内部class访问。除了所有这些之外,我还可以在需要时使用 A.__getitem__ 来提取大数据的 'slices'。所以外部 class 为我提供了 hiding/encapsulation 的数据,索引运算符(通过 __getitem__)和提取数据切片所需的所有例程(这里的方法 desc。内部 class、B 为每个索引提供了来自大数据的有用信息的捆绑。这很可能不是实现所描述任务的最佳设计。我很开放并且渴望听到您对替代模式的意见。

我看不出有任何理由让您在这里使用 classes,更不用说嵌套的了。在任何情况下,几乎没有理由将 classes 嵌套在 Python 中,因为内部 classes 没有对外部 class 的任何特殊访问权限。

然而,如果你想允许任何东西在不实例化对象的情况下访问一个方法,你可以使它成为一个class方法:

@classmethod
def desc(self):
  return a + '-' + b

但我不明白你为什么要这样做。此外,这里没有任何内容是闭包。