嵌套类:从内部类

时间:2015-11-24 16:59:11

标签: python nested nested-forms

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

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对类A的变量做了一些工作并产生输出。正确初始化类A,您可以访问变量ab,甚至可以从内部作用域访问,前提是您没有定义description变量。但是,我找不到一种方法来调用外部范围类方法desc。是否可以在desc中使用方法B而无需实例化类A

解释我使用这种模式的原因: 我程序中的变量ab相当大。我只需要初始化一次。另外,我不希望这些变量在程序中浮动,而只能访问内部类。除此之外,我还可以使用A.__getitem__在需要时提取大数据的“切片”。所以外层类为我提供了数据的隐藏/封装,索引操作符(通过__getitem__)以及提取数据切片所需的所有例程(这里是方法desc。内部类, B,提供来自每个索引的大数据的有用信息的捆绑。这很可能不是实现所描述任务的最佳设计。我很开放并渴望听取您对替代模式的看法。

1 个答案:

答案 0 :(得分:1)

我看不出你在这里使用类的任何理由,更不用说嵌套了。在任何情况下,几乎没有理由在Python中嵌套类,因为内部类没有获得对外部类的任何特殊访问。

但是,如果要在不实例化对象的情况下允许任何内容访问方法,可以将其作为类方法:

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

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