Como saber se um objeto possui um atributo em Python
-
03-07-2019 - |
Pergunta
Existe uma maneira em Python de determinar se um objeto possui algum atributo?Por exemplo:
>>> 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'
Como você pode saber se a
tem o atributo property
antes de usá-lo?
Solução
Tentar hasattr()
:
if hasattr(a, 'property'):
a.property
EDIT: Veja Resposta de Zweiterlinde Abaixo, quem oferece bons conselhos sobre pedir perdão! Uma abordagem muito pitônica!
A prática geral em Python é que, se a propriedade provavelmente estará lá na maioria das vezes, basta chamá -la e deixar a exceção se propagar ou prendê -la com uma tentativa/exceto bloco. Provavelmente será mais rápido do que hasattr
. Se a propriedade provavelmente não estará lá na maioria das vezes, ou você não tem certeza, usando hasattr
Provavelmente será mais rápido do que cair repetidamente em um bloco de exceção.
Outras dicas
Como Jarret Hardie respondidas, hasattr
vai fazer o truque. Gostaria de acrescentar, porém, que muitos na comunidade Python recomendam uma estratégia de "mais fácil pedir perdão do que permissão" (EAFP) em vez de "olhar antes de pular" (LBYL). Veja estas referências:
EAFP vs lbyl (ficou um pouco decepcionado até agora)
EAFP vs. lbyl @code como um pythonista: python idiomático
ou seja:
try:
doStuff(a.property)
except AttributeError:
otherStuff()
... é preferido a:
if hasattr(a, 'property'):
doStuff(a.property)
else:
otherStuff()
Você pode usar hasattr()
ou pegue AttributeError
, mas se você realmente deseja apenas o valor do atributo com um padrão se ele não estiver lá, a melhor opção é apenas usar getattr()
:
getattr(a, 'property', 'default value')
Eu acho que o que você está procurando é hasattr. No entanto, eu recomendo algo assim, se você quiser detectar Propriedades do Python-
try:
getattr(someObject, 'someProperty')
except AttributeError:
print "Doesn't exist"
else
print "Exists"
A desvantagem aqui é que os erros de atributo nas propriedades __get__
O código também é pego.
Caso contrário, faça-
if hasattr(someObject, 'someProp'):
#Access someProp/ set someProp
pass
Documentos:http://docs.python.org/library/functions.html
Aviso:
O motivo da minha recomendação é que a Hasattr não detecta propriedades.
Link:http://mail.python.org/pipermail/python-dev/2005-dcember/058498.html
De acordo com o Pydoc, o Hasattr (OBJ, Prop) simplesmente chama GetAtTr (OBJ, Prop) e captura exceções. Portanto, é tão válido envolver o acesso ao atributo com uma instrução Try e Catch AttributeError quanto usar o hasattr () com antecedência.
a = SomeClass()
try:
return a.fake_prop
except AttributeError:
return default_value
Eu gostaria de sugerir evitar isso:
try:
doStuff(a.property)
except AttributeError:
otherStuff()
O usuário @jpalecek mencionou: se um AttributeError
ocorre dentro doStuff()
, você está perdido.
Talvez essa abordagem seja melhor:
try:
val = a.property
except AttributeError:
otherStuff()
else:
doStuff(val)
Dependendo da situação você pode verificar com isinstance
que tipo de objeto você possui e, em seguida, use os atributos correspondentes.Com a introdução de classes base abstratas no Python 2.6/3.0, essa abordagem também se tornou muito mais poderosa (basicamente ABCs permite uma forma mais sofisticada de digitação de pato).
Uma situação em que isso seria útil seria se dois objetos diferentes tivessem um atributo com o mesmo nome, mas com significado diferente.Usando apenas hasattr
pode então levar a erros estranhos.
Um bom exemplo é a distinção entre iteradores e iteráveis (veja esse pergunta).O __iter__
métodos em um iterador e um iterável têm o mesmo nome, mas são semanticamente bem diferentes!Então hasattr
é inútil, mas isinstance
juntamente com a ABC fornece uma solução limpa.
Contudo, concordo que na maioria das situações o hasattr
abordagem (descrita em outras respostas) é a solução mais apropriada.
Hope you expecting hasattr(), but try to avoid hasattr() and please prefer getattr(). getattr() is faster than hasattr()
using hasattr():
if hasattr(a, 'property'):
print a.property
same here i am using getattr to get property if there is no property it return none
property = getattr(a,"property",None)
if property:
print property
EDIT:This approach has serious limitation. It should work if the object is an iterable one. Please check the comments below.
If you are using Python 3.6 or higher like me there is a convenient alternative to check whether an object has a particular attribute:
if 'attr1' in obj1:
print("attr1 = {}".format(obj1["attr1"]))
However, I'm not sure which is the best approach right now. using hasattr()
, using getattr()
or using in
. Comments are welcome.
Here's a very intuitive approach :
if 'property' in dir(a):
a.property
You can check whether object
contains attribute by using hasattr
builtin method.
For an instance if your object is a
and you want to check for attribute stuff
>>> class a:
... stuff = "something"
...
>>> hasattr(a,'stuff')
True
>>> hasattr(a,'other_stuff')
False
The method signature itself is hasattr(object, name) -> bool
which mean if object
has attribute which is passed to second argument in hasattr
than it gives boolean True
or False
according to the presence of name
attribute in object.
This is super simple, just use dir(
object)
This will return a list of every available function and attribute of the object.