在Python中,如何使用super作为类属性?

时间:2012-09-02 02:49:01

标签: python

考虑这两个类:

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

2 个答案:

答案 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.