[python] 파이썬에서 객체에 속성이 있는지 확인하는 방법

파이썬에서 객체에 속성이 있는지 확인하는 방법이 있습니까? 예를 들면 다음과 같습니다.

>>> 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'

a속성 property을 사용하기 전에 속성 이 있는지 어떻게 알 수 있습니까?



답변

시도 hasattr():

if hasattr(a, 'property'):
    a.property

편집 : 용서 요청에 대한 좋은 조언을 제공하는 아래 zweiterlinde의 답변을 참조하십시오 ! 매우 파이썬적인 접근 방식!

파이썬의 일반적인 관행은 속성이 대부분의 시간에있을 가능성이 높으면 단순히 호출하여 예외가 전파되도록하거나 try / except 블록으로 트랩하는 것입니다. 보다 빠를 것 hasattr입니다. 속성이 대부분 없을 것 같거나 확실하지 않은 hasattr경우 반복적으로 예외 블록에 빠지는 것보다 사용 속도가 더 빠릅니다.


답변

Jarret Hardie 가 대답 했듯이 hasattr트릭을 수행 할 것입니다. 그러나 파이썬 커뮤니티의 많은 사람들이 “도약하기 전에”(LBYL)보다는 “권한보다 용서를 구하는 것이 더 쉽다”(EAFP) 전략을 추천하고 싶다고 덧붙이고 싶습니다. 다음 참조를보십시오 :

EAFP vs LBYL (Re : 지금까지 조금 실망했습니다)
EAFP vs. LBYL @Code Pythonista와 같은 : 관용적 파이썬

즉 :

try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

…가 선호됩니다 :

if hasattr(a, 'property'):
    doStuff(a.property)
else:
    otherStuff()


답변

사용 hasattr()하거나 catch 할 수 AttributeError있지만 속성 값이없는 경우 기본값을 사용하여 속성 값을 원한다면 가장 좋은 옵션은 getattr()다음과 같습니다.

getattr(a, 'property', 'default value')


답변

나는 당신이 찾고있는 것이 hasattr 이라고 생각합니다 . 당신이 감지하려는 경우,이 같은 것을 권하고 싶습니다 파이썬 속성

try:
    getattr(someObject, 'someProperty')
except AttributeError:
    print "Doesn't exist"
else
    print "Exists"

여기서 단점은 속성 __get__코드의 속성 오류 도 발견 된다는 것입니다 .

그렇지 않으면

if hasattr(someObject, 'someProp'):
    #Access someProp/ set someProp
    pass

문서 : http://docs.python.org/library/functions.html
경고 :
내 추천 이유는 hasattr이 속성을 감지하지 못하기 때문입니다.
링크 : http://mail.python.org/pipermail/python-dev/2005-December/058498.html


답변

pydoc에 따르면 hasattr (obj, prop)은 getattr (obj, prop)를 호출하고 예외를 포착합니다. 따라서 try 문으로 속성 액세스를 래핑하고 사전에 hasattr ()을 사용하는 것과 같이 AttributeError를 잡는 것도 유효합니다.

a = SomeClass()
try:
    return a.fake_prop
except AttributeError:
    return default_value


답변

나는 이것을 피할 것을 제안하고 싶다 :

try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

@jpalecek 사용자가 그것을 언급했습니다 : AttributeError내부 doStuff()에서 발생 하면 손실됩니다.

어쩌면이 접근법이 더 낫습니다.

try:
    val = a.property
except AttributeError:
    otherStuff()
else:
    doStuff(val)


답변

상황에 따라 isinstance어떤 종류의 객체를 가지고 있는지 확인한 다음 해당 속성을 사용할 수 있습니다. Python 2.6 / 3.0 에 추상 기본 클래스 가 도입 되면서이 접근 방식도 훨씬 강력 해졌습니다 (기본적으로 ABC는보다 정교한 오리 입력 방식을 허용합니다).

한 가지 상황은 두 개의 서로 다른 객체가 동일한 이름을 가지고 있지만 의미가 다른 속성을 갖는 경우 유용합니다. hasattr그런 다음에 만 사용하면 이상한 오류가 발생할 수 있습니다.

좋은 예 중 하나는 이터레이터와 이터 러블 사이의 구별입니다 ( 질문 참조 ). __iter__이터레이터와 이터 러블 의 메소드는 이름은 같지만 의미 상 상당히 다릅니다! 따라서 hasattr쓸모는 없지만 isinstanceABC와 함께 깨끗한 솔루션을 제공합니다.

그러나 대부분의 상황에서 hasattr(다른 답변에 설명 된) 접근 방식이 가장 적합한 솔루션 이라는 데 동의합니다 .