这不起作用:
class A:
a1 = 4
class B:
b1 = A.a1 # Fails
b2 = 6
class C:
c1 = A.B.b2 # Fails
任何非神秘的解决方法?我知道我可以从A中取出B和C,但我希望将它们嵌入。我也认为没有类成员会更容易,因为它们很容易在构造函数中作为参数传递给嵌套类,但是所有这些类成员我都不知道如何在这里做类似的事情。我还读过一些线程,这个用法会记住使用类作为命名空间,应该使用模块而不是类来解决,但上面的类是我的实际类(我构造实例),我希望分享adition中的类数据其中。
答案 0 :(得分:3)
您可以推迟B
的定义,直到A
完全定义,并推迟C
,直到定义A
和A.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
这样可以避免在创建后对类进行猴子修补。