Is er een manier in Python om te bepalen of een object een bepaald attribuut heeft? Bijvoorbeeld:
>>> 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'
Hoe kan je zien of a
het attribuut property
heeft voordat je het gebruikt?
Probeer hasattr()
:
if hasattr(a, 'property'):
a.property
EDIT: Zie zweiterlinde's antwoord hieronder, die goed advies geeft over het vragen van vergeving! Een zeer pythonische benadering!
De algemene praktijk in python is dat, als de eigenschap er waarschijnlijk het grootste deel van de tijd zal zijn, roep het gewoon aan en laat ofwel de uitzondering zich voortplanten, of vang het met een try/except-blok. Dit zal waarschijnlijk sneller zijn dan hasattr
. Als de eigenschap er waarschijnlijk meestal niet is, of je bent er niet zeker van, dan zal het gebruik van hasattr
waarschijnlijk sneller zijn dan het herhaaldelijk vallen in een exception blok.
Ik denk dat waar je naar op zoek bent hasattr is. Ik'zou echter iets als dit aanraden als je python eigenschappen- wilt detecteren
try:
getattr(someObject, 'someProperty')
except AttributeError:
print "Doesn't exist"
else
print "Exists"
Het nadeel hier is dat attribuut fouten in de properties __get__
code ook worden opgevangen.
Anders, do-
if hasattr(someObject, 'someProp'):
#Access someProp/ set someProp
pass
Docs:http://docs.python.org/library/functions.html
Waarschuwing:
De reden voor mijn aanbeveling is dat hasattr geen eigenschappen detecteert'*.
Link:http://mail.python.org/pipermail/python-dev/2005-December/058498.html
Volgens pydoc roept hasattr(obj, prop) eenvoudig getattr(obj, prop) aan en vangt excepties op. Dus, het is net zo geldig om de attribuut toegang te omwikkelen met een try statement en AttributeError te vangen als het is om hasattr() vooraf te gebruiken.
a = SomeClass()
try:
return a.fake_prop
except AttributeError:
return default_value