Come sapere se un oggetto ha un attributo in Python

C'è un modo in Python per determinare se un oggetto ha qualche attributo? Per esempio:

>>> 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'

Come si può dire se a ha l'attributo property prima di usarlo?

Soluzione

Prova hasattr():

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

EDIT: Vedi zweiterlinde'risposta qui sotto, che offre un buon consiglio sul chiedere perdono! Un approccio molto pitonico!

La pratica generale in python è che, se è probabile che la proprietà sia lì per la maggior parte del tempo, basta chiamarla e lasciare che l'eccezione si propaghi, o intrappolarla con un blocco try/except. Questo sarà probabilmente più veloce di hasattr. Se è probabile che la proprietà non sia presente per la maggior parte del tempo, o non siete sicuri, usare hasattr sarà probabilmente più veloce che cadere ripetutamente in un blocco di eccezioni.

Commentari (6)

Penso che quello che stai cercando sia hasattr. Tuttavia, ti consiglierei qualcosa del genere se vuoi rilevare le proprietàpython-.

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

Lo svantaggio qui è che vengono catturati anche gli errori di attributo nel codice __get__ delle proprietà.

Altrimenti, do-

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

Docs:http://docs.python.org/library/functions.html Attenzione: La ragione della mia raccomandazione è che hasattr non rileva le proprietà.
Link:http://mail.python.org/pipermail/python-dev/2005-December/058498.html

Commentari (3)

Secondo pydoc, hasattr(obj, prop) chiama semplicemente getattr(obj, prop) e cattura le eccezioni. Quindi, è altrettanto valido avvolgere l'accesso all'attributo con una dichiarazione try e catturare AttributeError quanto usare hasattr() prima.

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