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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top