Ali v Pythonu obstaja način, kako ugotoviti, ali ima predmet nek atribut? Na primer:
>>> 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'
Kako lahko ugotovite, ali ima a
atribut property
, preden ga uporabite?
Poskusite hasattr()
:
if hasattr(a, 'property'):
a.property
EDIT: Glej zweiterlinde's answer spodaj, ki ponuja dober nasvet glede prošnje za odpuščanje! Zelo pitonski pristop!
Splošna praksa v pythonu je, da če bo lastnost verjetno prisotna večino časa, jo preprosto pokličite in pustite, da se izjema razširi, ali pa jo ujemite z blokom try/except. To bo verjetno hitrejše kot hasattr
. Če lastnost večino časa verjetno ne obstaja ali pa niste prepričani, bo uporaba hasattr
verjetno hitrejša kot ponavljajoče se padanje v blok izjem.
Mislim, da iščete hasattr. Vendar bi priporočal nekaj takega, če želite zaznati lastnosti pythona-
try:
getattr(someObject, 'someProperty')
except AttributeError:
print "Doesn't exist"
else
print "Exists"
Pomanjkljivost tega je, da se ujamejo tudi napake atributov v kodi lastnosti __get__
.
V nasprotnem primeru je treba narediti
if hasattr(someObject, 'someProp'):
#Access someProp/ set someProp
pass
Dokumenti:http://docs.python.org/library/functions.html
Pozorilo:
Razlog za moje priporočilo je, da hasattr ne zazna lastnosti.
Povezava:http://mail.python.org/pipermail/python-dev/2005-December/058498.html
V skladu s pydocom hasattr(obj, prop) preprosto kliče getattr(obj, prop) in ujame izjeme. Zato je enako veljavno, da dostop do atributa zavijemo z ukazom try in ujamemo AttributeError, kot če pred tem uporabimo hasattr().
a = SomeClass()
try:
return a.fake_prop
except AttributeError:
return default_value