考虑这两个类:
class A(object):
name = "A"
class B(A):
name = "Child of " + A.name
简单。 A.name
将为“A”,B.name
将为“A的孩子”。
但将A.name
硬编码到B
的{{1}}定义中似乎是错误的。我自然想要写一些类似的东西:
name
但是,在class B(A):
name = "Child of " + super(B).name
表达式中,NameError
尚未定义B
。 (另外,我不确定它是否应该是super(B)
或super(B)
或其他什么,但鉴于super(B, B)
,这是一个没有实际意义的点。)
这样做的正确方法是什么,即在类属性的定义中使用NameError
?
答案 0 :(得分:2)
在类定义中无法完成,因为您发现:在类定义中,您无法访问类本身,因为它尚未定义。
你可以使用类装饰器(如果你使用的是带有类装饰器的Python版本,我认为它是2.6及以上):
>>> class A(object):
... name = "A"
>>> def makeAttr(cls):
... cls.name = "Child of " + super(cls, cls).name
... return cls
>>> @makeAttr
... class B(A):
... name = "B"
>>> B.name
'Child of A'
答案 1 :(得分:0)
你做不到。如果必须这样做,则需要在B的主体中明确使用A.