3

Python では、初期化された値を持つクラス属性、辞書が必要です。私はこのコードを書きました:

class MetaDataElement:
    (MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
    mapInitiator2Type = {'!':MetaDataElement.MD_CATEGORY, 
                         '#':MetaDataElement.MD_TAG}

しかし、このコードを実行しようとすると、「NameError: name 'MetaDataElement' is not defined」というエラー メッセージが表示されます。私たちを手伝ってくれますか?

前もって感謝します。

4

2 に答える 2

3

MetaDataElementまだ存在しないため、構築中は参照できません。したがって、

class MetaDataElement:
    (MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
    mapInitiator2Type = {'!':MetaDataElement.MD_CATEGORY, 
                         '#':MetaDataElement.MD_TAG}

の構築そのものが、まだ持っていない属性を持つmapInitiator2Type必要があるため、失敗します。定数などは、クラスの構築に対してローカルな変数MetaDataElementと考えることができます。MD_INVALIDこれが、icktoofay が書いたように、次のように機能する理由です。

class MetaDataElement:
    (MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
    mapInitiator2Type = {'!': MD_CATEGORY,  # MD_CATEGORY is like a local variable!
                         '#': MD_TAG}

MetaDataElementただし、次のように、まだ解釈されていないコード片でクラスを参照できます。

    def method_of_MetaDataElement(self):
        print MetaDataElement.MD_TAG

は実行時に一種のローカル変数ではないため、ここでも参照する必要があります (はクラス構築時に一種のローカル変数として定義されただけです)。クラスが作成されると、単にクラス属性になるため、そのように参照する必要があります。MetaDataElementMD_TAGmethod_of_MetaDataElement()MD_TAGMetaDataElementMD_TAGmethod_of_MetaDataElement()

于 2010-07-23T06:46:02.840 に答える
1

まず、古いスタイルのクラスを使用しています。次のように、おそらく新しいスタイルのクラスを使用する必要があります。

class MetaDataElement(object):
    ...

に注意してください(object)。とにかく、MetaDataElement.クラス属性を参照するときは単に を削除してください。これが完了すると、次のようになります。

class MetaDataElement(object):
    (MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
    mapInitiator2Type = {'!': MD_CATEGORY, 
                         '#': MD_TAG}
于 2010-07-23T05:09:47.510 に答える