Python: referencia al nombre de la clase desde el interior del cuerpo de la clase
-
27-09-2020 - |
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.
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}