python:嵌套类:访问外部类类成员

时间:2016-09-16 17:56:14

标签: python nested inner-classes

这不起作用:

class A:
  a1 = 4

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

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

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

3 个答案:

答案 0 :(得分:3)

您可以推迟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.b1的定义之外定义B

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

答案 1 :(得分:1)

由于两个不同的原因,这失败了。一个是当您尝试访问A A.a1中的B时,NameError尚未就绪。

如果使用子类解决此问题。以下内容适用:

class A:
  a1 = 4

class _A(A):

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

然而,访问A.B.b2中的C仍然无效,因为A没有属性B。您将获得AttributeError

答案 2 :(得分:0)

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

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

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