【问题标题】:python: nested classes: access outer class class memberpython:嵌套类:访问外部类类成员
【发布时间】:2017-01-25 00:54:59
【问题描述】:

这不起作用:

class A:
  a1 = 4

  class B:
    b1 = A.a1  # Fails
    b2 = 6

  class C:
    c1 = A.B.b2  # Fails

任何非神秘的方法来解决它?我知道我可以从 A 中取出 B 和 C,但我想让它们嵌入。我也认为没有类成员会更容易,因为它们可以很容易地作为构造函数中的参数传递给嵌套类,但是作为所有类成员,我不知道如何在这里做一些类似的事情。我还在一些线程上读到,这种用法记得使用类作为命名空间,应该使用模块而不是类来解决,但上面的类对我来说是真实的类(我构造实例),此外还有我想分享的类数据其中。

【问题讨论】:

  • “简单”的出路是ABC都继承自一个参数类。
  • 不确定你说的是什么。在顶部添加另一个级别的继承?
  • 见下文。基本上有A(Param)B(Param) 或者从Param 拉入类变量而不是A,如果您需要不同的参数名称。
  • 嵌套的用例是什么?
  • B 和 C 在某些情况下是用于对 A 中使用的静态符号进行分组的命名空间,我将它们放在 A 内部的类中,用于符号组中的分层代码组织(如枚举、选项)。某些组的符号引用了其他组中的符号。

标签: python nested inner-classes


【解决方案1】:

您可以将B 的定义推迟到A 完全定义后,并将C 推迟到AA.B 都定义完毕。

class A:
  a1 = 4

class B:
  b1 = A.a1
  b2 = 6
A.B = B
del B

class C:
  c1 = A.B.b2
A.C = C
del C

assert A.B.b1 == 4
assert A.C.c1 == 6

或者,您可以在 B 的定义之外定义 B.b1

class A:
  a1 = 4

  class B:
    pass
  B.b1 = a1
  B.b2 = 6

  class C:
    pass
  C.c1 = B.b2

assert A.B.b1 == 4
assert A.C.c1 == 6

【讨论】:

    【解决方案2】:

    这失败有两个不同的原因。一是当您尝试在B 中访问A.a1 给您NameError 时,A 还没有准备好。

    如果您使用子类解决此问题。以下将起作用:

    class A:
      a1 = 4
    
    class _A(A):
    
      class B:
        b1 = A.a1  # Fails
        b2 = 6
    

    但是在C 中访问A.B.b2 仍然无法正常工作,因为A 没有B 属性。你会得到一个AttributeError

    【讨论】:

      【解决方案3】:

      一个技巧是将公共参数放入一个参数类并从中继承:

      class Params:
         p = 4
      
      class A(Params):
          # A has p
          class B(Params):
              # B has p
              pass
      
          class C(Params):
              # C has p
              pass
      

      或者,如果您需要内部类中具有不同名称的参数:

      class A(Params):
          # A has p
          class B:
              b = Params.p
      
          class C:
              c = Params.p
      

      这样可以避免在创建后对类进行猴子补丁。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-26
        • 1970-01-01
        • 1970-01-01
        • 2013-11-14
        • 2015-01-26
        • 2014-10-30
        • 2020-08-02
        • 1970-01-01
        相关资源
        最近更新 更多