0

ライブラリにいくつかの属性が割り当てられている親クラスを設計しようとしています。

class CC():
    Features = {"1" : "", "2" : ""}



class F(CC):
    Features["1"] = { key : value }

そのクラスの子の辞書の要素を(サブ辞書で)上書きしようとすると、次のようになります。

Traceback (most recent call last):
  File "C:\Python27\Rough\Starting UP\AttributeInput.py", line 7, in <module>
    PersonClass = Fighter()
  File "C:\Python27\Rough\Starting UP\CharClass.py", line 45, in __init__
    classFeatures["1"] = {"Bonus Feat" : "Select a free feat from Fighter List"} 
NameError: global name 'classFeatures' is not defined

辞書をグローバルに宣言するのは悪い考えのように思えますが、「機能」のキーを独自の特定の値に分解せずに特定の要素をオーバーライドするにはどうすればよいですか?

以下のコメントとして編集

4

1 に答える 1

1

クラスがまだ定義されていない (まだ定義されている) ため、クラス定義内のスーパークラス属性にアクセスすることはできません。また、それらにアクセスできる場合 (または を実行して明示的にアクセスする場合)、で新しい dict を作成するのではなくCC.Features、 で dict を変更することに注意してください。したがって、 での変更はに影響しますが、これはほぼ確実に望んでいるものではありません。CCFFCC

1 つの方法は、クラス デコレータを使用して、定義後にクラスを変更することです。たとえば、そのFeatures値をそのスーパークラスの値とマージします。これは、メタクラスでも実行できます。

Featuresこれは、実際にクラス属性になりたいと想定しています。あなたの例からは明確ではありませんが、多くの場合、インスタンス属性にする方が良いかもしれません。その場合、 で更新し__init__ます。

Featureおそらく、属性をどのように使用しているか、それを使用して何を達成したいかについて、もう少し情報を提供できます。

于 2013-01-24T03:06:59.153 に答える