1

次の 2 つのクラスを検討してください。

class A(object):
    name = "A"

class B(A):
    name = "Child of " + A.name

単純。A.name「A」になり、「AのB.name子」になります。

しかし、の の定義にハード コードA.nameするのは間違っているようです。私は自然に次のようなものを書きたいです:Bname

class B(A):
    name = "Child of " + super(B).name

しかし、それは式でまだ定義されていないNameErrorwithを発生させます。(また、それが他のものであるべきかどうかはわかりませんが、 .)Bsuper(B)super(B)super(B, B)NameError

これを行う正しい方法は何ですか?つまりsuper、クラス属性の定義で使用しますか?

4

2 に答える 2

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'
于 2012-09-02T03:01:45.170 に答える
0

それはいけません。これを行う必要がある場合は、B の本体で明示的に A を使用する必要があります。

于 2012-09-02T02:50:12.120 に答える