Pregunta

En Python, quiero tener un atributo de clase, un diccionario, con valores inicializados.Escribí este código:

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

Pero cuando intento ejecutar este código, aparece un mensaje de error con "NameError:El nombre 'MetaDataElement' no está definido".¿Usted me podría ayudar?

Gracias de antemano.

¿Fue útil?

Solución

No puedes referirte a MetaDataElement mientras se construye, ya que aún no existe.De este modo,

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

fracasa porque la propia construcción de mapInitiator2Type requiere MetaDataElement tener atributos que aún no tiene.Puedes pensar en tus constantes. MD_INVALID, etc.como variables que son locales para la construcción de su clase.Es por eso que lo siguiente funciona, como escribió icktoofay:

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

Sin embargo, puedes consultar la clase. MetaDataElement en cualquier fragmento de código aún no interpretado, como en

    def method_of_MetaDataElement(self):
        print MetaDataElement.MD_TAG

Incluso tener hacer referencia a MetaDataElement, aquí, porque MD_TAG no es un tipo de variable local cuando method_of_MetaDataElement() es ejecutado (MD_TAG solo se definió como una especie de variable local durante la construcción de la clase).Una vez la clase MetaDataElement es creado, MD_TAG es simplemente un atributo de clase, razón por la cual method_of_MetaDataElement() debe referirse a él como tal.

Otros consejos

En primer lugar, estás usando clases al estilo antiguo.Probablemente deberías usar clases de nuevo estilo, así:

class MetaDataElement(object):
    ...

Nota la (object).De todos modos, simplemente retire el MetaDataElement. cuando se hace referencia a los atributos de clase.Así es como se vería cuando esté hecho:

class MetaDataElement(object):
    (MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
    mapInitiator2Type = {'!': MD_CATEGORY, 
                         '#': MD_TAG}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top