1137 votos

Cómo saber si un objeto tiene un atributo en Python

Hay una manera en Python para determinar si un objeto tiene un atributo? Por ejemplo:

>>> a = SomeClass()
>>> a.someProperty = value
>>> a.property
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: SomeClass instance has no attribute 'property'

¿Cómo se puede saber si a tiene el atributo property antes de usarlo?

1590voto

Jarret Hardie Puntos 36266

Intente hasattr():

if hasattr(a, 'property'):
    a.property

EDIT: a Ver zweiterlinde la respuesta de abajo, que ofrece buenos consejos acerca de pedir perdón! Una muy python el enfoque!

La práctica general en python es que, si la propiedad es probable que allí la mayoría del tiempo, simplemente llamar y dejar que la excepción se propagan, o de trampa con un bloque try/except. Esto probablemente va a ser más rápido que hasattr. Si la propiedad es probable que no existe mayor parte del tiempo, o no estás seguro, utilizando hasattr probablemente será más rápido que en repetidas ocasiones de caer en un bloque de excepción.

461voto

zweiterlinde Puntos 5984

Como Jarret Hardie respondió, hasattr hará el truco. Me gustaría añadir, sin embargo, que muchos en la comunidad de Python recomendar una estrategia de "más fácil pedir perdón que permiso" (EAFP) en lugar de "mirar antes de saltar" (LBYL). Ver estas referencias:

EAFP vs LBYL (era Re: Un poco decepcionado hasta ahora)
EAFP vs. LBYL @Código Como un Pythonista: Idiomática Python

es decir:

try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

... es preferido a:

if hasattr(a, 'property'):
    doStuff(a.property)
else:
    otherStuff()

370voto

Carl Meyer Puntos 30736

Usted puede utilizar hasattr() o coger AttributeError, pero si usted realmente desea que el valor del atributo con un valor predeterminado si no hay, la mejor opción es sólo para uso getattr():

getattr(a, 'property', 'default value')

33voto

batbrat Puntos 3481

Creo que lo que se busca es la hasattr. Sin embargo, yo recomendaría algo como esto si se quiere detectar python propiedades-

try:
    getattr(someObject, 'someProperty')         
except AttributeError:
    print "Doesn't exist"
else
    print "Exists"

La desventaja aquí es que el atributo de errores en las propiedades __get__ código también son capturados.

De lo contrario, hacer-

if hasattr(someObject, 'someProp'):
    #Access someProp/ set someProp
    pass

Docs:http://docs.python.org/library/functions.html
Advertencia:
La razón de mi recomendación es que hasattr no detectar propiedades.
Enlace:http://mail.python.org/pipermail/python-dev/2005-December/058498.html

24voto

Jordan Lewis Puntos 3456

Según pydoc, hasattr(obj, prop) simplemente llama a getattr(obj, prop) y la captura de excepciones. Así, es igual de válido para envolver el atributo de acceso con una instrucción try y catch AttributeError como el uso de hasattr() de antemano.

a = SomeClass()
try:
    return a.fake_prop
except AttributeError:
    return default_value

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X