문제

파이썬에는 객체에 속성이 있는지 확인하는 방법이 있습니까? 예를 들어:

>>> 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의 답변 아래는 용서에 대한 좋은 조언을 제공합니다! 매우 피한 접근 방식!

Python의 일반적인 관행은 속성이 대부분의 시간에있을 가능성이 높으면 단순히 전화를 걸어 예외를 전파하거나 시도/제외한 블록으로 덫을 놓는 것입니다. 이것은 아마도 더 빠를 것입니다 hasattr. 부동산이 대부분의 시간에 없을 가능성이 있거나 확실하지 않은 경우 hasattr 예외 블록에 반복적으로 떨어지는 것보다 빠를 것입니다.

다른 팁

처럼 Jarret Hardie 대답, hasattr 트릭을 할 것입니다. 그러나 Python 커뮤니티의 많은 사람들이 "당신이 도약하기 전에보기"(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() 또는 캐치 AttributeError, 그러나, 당신이 실제로 존재하지 않으면 기본값으로 속성의 값을 원한다면, 가장 좋은 옵션은 단지 사용하는 것입니다. getattr():

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

나는 당신이 찾고있는 것이라고 생각합니다 Hasattr. 그러나 감지하고 싶다면 이와 같은 것을 추천합니다. 파이썬 특성-

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

여기서 단점은 속성의 속성 오류가 있다는 것입니다. __get__ 코드도 잡혔습니다.

그렇지 않으면, do-

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)을 호출하고 예외를 포착합니다. 따라서 속성 액세스를 시도 문으로 랩핑하고 hasattr ()를 미리 사용하는 것만 큼 속성 액세스를 랩핑하는 것이 유효합니다.

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 접근 방식 (다른 답변에 설명)이 가장 적절한 솔루션입니다.

hasattr ()를 기대하지만 hasattr ()를 피하고 getAttr ()를 선호하십시오. getAttr ()는 hasattr ()보다 빠릅니다.

hasattr () 사용 :

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

동일 여기에 나는 속성이 없으면 재산을 얻기 위해 getattr을 사용하고 있습니다.

   property = getattr(a,"property",None)
    if property:
        print property

편집하다:이 접근법에는 심각한 제한이 있습니다. 객체가 an이면 작동해야합니다 반복적 인 하나. 아래 의견을 확인하십시오.

사용중인 경우 파이썬 3.6 또는 나와 같은 객체에 특정 속성이 있는지 확인하는 편리한 대안이 있습니다.

if 'attr1' in obj1:
    print("attr1 = {}".format(obj1["attr1"]))

그러나 지금 당장 가장 좋은 접근 방식이 확실하지 않습니다. 사용 hasattr(), 사용 getattr() 또는 사용 in. 의견을 환영합니다.

다음은 매우 직관적 인 접근법입니다.

if 'property' in dir(a):
    a.property

당신은 여부를 확인할 수 있습니다 object 사용하여 속성이 포함되어 있습니다 hasattr 내장 방법.

객체 인 경우 예를 들어 a 그리고 당신은 속성을 확인하고 싶습니다 stuff

>>> class a:
...     stuff = "something"
... 
>>> hasattr(a,'stuff')
True
>>> hasattr(a,'other_stuff')
False

메소드 서명 자체는 다음과 같습니다 hasattr(object, name) -> bool 즉, IF를 의미합니다 object 가지다 기인하다 두 번째 논쟁으로 전달됩니다 hasattr 부울을주는 것보다 True 또는 False 의 존재에 따라 name 객체의 속성.

이것은 매우 간단합니다 dir(물체)
이것은 객체의 모든 가용 함수와 속성의 목록을 반환합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top