Există un mod în Python pentru a determina dacă un obiect are un atribut? De exemplu:
>>> 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'
Cum pot să vă spun dacă
Încerca hasattr()
:
if hasattr(a, 'property'):
a.property
EDIT: a se Vedea zweiterlinde's a răspunde de mai jos, care oferă sfaturi bune despre cer iertare! Un foarte pythonic abordare!
Practica generală în python este că, în cazul în care proprietatea este probabil să fie acolo, pur și simplu să suni și să fie excepția propaga, sau prinde-l cu blocuri try/except. Acest lucru va fi probabil mai repede decât hasattr
. În cazul în care proprietatea este probabil să nu fie acolo, sau're nu sunt sigur, folosind hasattr
va fi, probabil, mai repede decât în mod repetat, care se încadrează într-o excepție de bloc.
Ca Jarret Hardie, a răspuns, hasattr
va face truc. Aș dori să adaug, totuși, că mulți din comunitatea Python recomanda o strategie de "mai ușor pentru a cere iertarea decât permisiunea" (EAFP), mai degrabă decât "nu te pripi" (LBYL). A se vedea aceste referințe:
EAFP vs LBYL (a fost Re: Un pic dezamăgit până în prezent) EAFP vs LBYL @Cod Ca un Pythonista: Idiomatice Python
de exemplu:
try:
doStuff(a.property)
except AttributeError:
otherStuff()
... este de preferat să:
if hasattr(a, 'property'):
doStuff(a.property)
else:
otherStuff()
Puteți folosi hasattr()sau prinde AttributeError, dar dacă într-adevăr vrei doar valoarea atributului cu un default e't acolo, cea mai bună opțiune este de a utiliza [
getattr()`](https://docs.python.org/library/functions.html#getattr):
getattr(a, 'property', 'default value')
Cred ca ceea ce cauti este hasattr. Cu toate acestea, am'd recomanda ceva de genul asta dacă vrei să detecteze python proprietăți-
try:
getattr(someObject, 'someProperty')
except AttributeError:
print "Doesn't exist"
else
print "Exists"
Dezavantajul aici este ca atribut erori în proprietăți `ia cod sunt, de asemenea, prins.
În caz contrar, nu-
if hasattr(someObject, 'someProp'):
#Access someProp/ set someProp
pass
Docs:http://docs.python.org/library/functions.html Avertisment: Motivul pentru care recomandarea mea este ca hasattr nu't detecta proprietăți. Link:http://mail.python.org/pipermail/python-dev/2005-December/058498.html
Potrivit pydoc, hasattr(obj, prop) pur și simplu apeluri getattr(obj, prop) și capturile excepții. Deci, este la fel de valabil pentru a încheia atributul de acces cu o declarație try și catch AttributeError ca este de a utiliza hasattr() în prealabil.
a = SomeClass()
try:
return a.fake_prop
except AttributeError:
return default_value
Aș dori să sugerez evita acest lucru:
try:
doStuff(a.property)
except AttributeError:
otherStuff()
Utilizatorul @jpalecek menționat: Dacă o AttributeError
apare în interiorul doStuff()
, ești pierdut.
Poate că această abordare este mai bună:
try:
val = a.property
except AttributeError:
otherStuff()
else:
doStuff(val)
În funcție de situație, puteți verifica cu isinstance` ce fel de obiect trebuie, și apoi utilizați atributele corespunzătoare. Cu introducerea de abstract clase de bază în Python 2.6/3.0 această abordare a devenit, de asemenea, mult mai puternic (practic Abc-ul permite un mod mai sofisticat de duck typing).
O situație acest lucru este util ar fi dacă două obiecte diferite au un atribut cu același nume, dar cu sens diferit. Folosind doar hasattr
ar putea apoi duce la erori ciudate.
Un exemplu frumos este distincția între iteratori și iterables (a se vedea acest întrebare). Anii __iter__
metode într-un iterator și o iterable au același nume, dar sunt semantic destul de diferite! Deci hasattr
este inutil, dar `isinstance împreună cu ABC's oferă o soluție curată.
Cu toate acestea, sunt de acord că, în cele mai multe situații `hasattr abordare (descrise în alte răspunsuri) este soluția cea mai potrivită.
Sper că vă așteaptă hasattr(), dar încearcă să evite hasattr() și vă rugăm să prefera getattr(). getattr() este mai rapid decât hasattr()
folosind hasattr():
if hasattr(a, 'property'):
print a.property
la fel și aici eu sunt, folosind getattr pentru a obține proprietate dacă nu există nici o proprietate a reveni niciuna
property = getattr(a,"property",None)
if property:
print property
EDIT:Această abordare are limitare serioasă. Acesta ar trebui să funcționeze în cazul în care obiectul este un iterable una. Vă rugăm să verificați comentarii de mai jos.
Dacă utilizați Python 3.6 sau mai mare ca mine nu există o alternativă convenabilă de a verifica dacă un obiect are un anumit atribut:
if 'attr1' in obj1:
print("attr1 = {}".format(obj1["attr1"]))
Cu toate acestea, am'm nu sunt sigur care este cea mai bună abordare, chiar acum. folosind hasattr()
, folosind getattr()
sau folosind "în". Comentariile sunt binevenite.
Puteți verifica dacă "obiect" conține atributul prin utilizarea hasattr
interna metodă.
De exemplu, dacă obiectul este " a "și doriți să verificați pentru atributul "chestii" ``
clasa a: ... lucrurile = "ceva" ... hasattr(o,'lucrurile') Adevărat hasattr(o,'other_stuff') False ``
Semnătura metodă în sine este hasattr(obiect, nume) -> bool
ceea ce înseamnă, dacă "obiect" atributul care este trecut la al doilea argument în hasattr
decât dă booleene "True" sau "False" în funcție de prezența de "nume" atribut în obiect.
O altă opțiune este posibil, dar depinde la ce te referi prin înainte:
undefined = object()
class Widget:
def __init__(self):
self.bar = 1
def zoom(self):
print("zoom!")
a = Widget()
bar = getattr(a, "bar", undefined)
if bar is not undefined:
print("bar:%s" % (bar))
foo = getattr(a, "foo", undefined)
if foo is not undefined:
print("foo:%s" % (foo))
zoom = getattr(a, "zoom", undefined)
if zoom is not undefined:
zoom()
ieșire:
bar:1
zoom!
Acest lucru vă permite pentru a verifica chiar pentru Nici unul atributele.
Dar! Fi foarte atent să nu - 't accidental instantia și compara "nedefinit" mai multe locuri pentru că "este" nu va funcționa în acest caz.