파이썬에서 객체에 속성이 있는지 확인하는 방법이 있습니까? 예를 들면 다음과 같습니다.
>>> 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
쓸모는 없지만 isinstance
ABC와 함께 깨끗한 솔루션을 제공합니다.
그러나 대부분의 상황에서 hasattr
(다른 답변에 설명 된) 접근 방식이 가장 적합한 솔루션 이라는 데 동의합니다 .