itsource

Python에서 객체에 속성이 있는지 확인하려면 어떻게 해야 합니까?

mycopycode 2022. 10. 26. 22:40
반응형

Python에서 객체에 속성이 있는지 확인하려면 어떻게 해야 합니까?

개체에 속성이 있는지 확인하려면 어떻게 해야 합니까?예를 들어 다음과 같습니다.

>>> a = SomeClass()
>>> a.property
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: SomeClass instance has no attribute 'property'

이 경우 어떻게 알 수 있죠?a에는 「」가 .property★★★★★★★★★★★★★★★★★?

시도:

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

용서를 구하는 것에 대한 좋은 조언을 제공하는 zweiterlinde의 대답을 아래에서 보세요!매우 비호조적인 접근법!

python의 일반적인 관행은 속성이 대부분의 경우 해당 속성을 호출하여 예외를 전파하거나 try/except 블록을 사용하여 트랩하는 것입니다.이 더 것 더 빠를 것 같습니다.hasattr의 경우,, "예"를 사용하여 자산이 수 hasattr예외 블록에 반복적으로 빠지는 것보다 빠를 수 있습니다.

자렛 하디가 대답했듯이hasattr의 많은 이, 「」( you leap)이 「허가보다 」(.다만, Python 커뮤니티의 많은 사람들이, 「도약하기 전에」(LBIL)이 아니고, 「허가보다 용서를 구하는 것이 쉽다」(EAFP)의 전략을 추천하고 있습니다.이치노

EAFP vs LBIL (현재까지는 조금 실망)
EAFP vs. Pythonista와 같은 LBIL @코드:이디오매틱 파이썬

즉,

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

...보다 우선:

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

하시면 됩니다.hasattr() 는는 or or를 잡는다.AttributeError단, Atribute 값이 존재하지 않는 경우 기본값만 사용하는 것이 가장 좋습니다.

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

당신이 찾고 있는 것은 하사트르라고 생각합니다.하지만 파이썬의 속성을 검출하고 싶다면 이런 을 추천합니다.

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
★★★★
제가 추천하는 이유는 hasatr이 속성을 감지하지 못하기 때문입니다.
링크: http://mail.python.org/pipermail/python-dev/2005-December/058498.html

pydoc에 따르면 hasattr(obj, prop)는 getattr(obj, prop)를 호출하여 예외를 포착합니다.따라서 미리 hasattr()을 사용하는 것과 마찬가지로 속성 액세스를 try문으로 랩하고 AttributeError를 캐치하는 것도 유효합니다.

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

이것을 피하는 것이 좋습니다.

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

jpalecek의 경우.AttributeErrordoStuff()잃었어요.

이 방법이 더 나을 수 있습니다.

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

hasattr()은요, 제가 은요.hasattr()(불필요한 것을 피하기 위해) 주장과 함께 잘 사용될 수 있다if"CHANGE: "CHANGE: "CHANGE: "CHANGE: "CHANGE:

assert hasattr(a, 'property'), 'object lacks property' 
print(a.property)

수 없는 됩니다.AssertionError출력)를 합니다.object lacks property(어느 쪽인가)

SO에 대한 다른 답변에서 언급된 바와 같이:

Assert는 절대 발생하지 않아야 할 조건을 테스트하기 위해 사용해야 합니다.목적은 프로그램 상태가 손상된 경우 조기에 크래시하는 것입니다.

속성이 누락되어 그 다음에 재산이 되어 있는 됩니다.assert매우 적절합니다.

편집: 이 방법에는 심각한 제한이 있습니다.오브젝트가 반복 가능한 오브젝트일 경우 동작합니다.아래의 코멘트를 확인해 주세요.

저와 같은 Python 3.6 이상을 사용하고 있다면 오브젝트에 특정 속성이 있는지 확인하는 편리한 대안이 있습니다.

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

하지만 지금으로서는 어느 것이 최선의 방법인지 잘 모르겠습니다.사용.hasattr() 를 사용합니다.getattr() 「」를 사용합니다.in댓글 달아주시면 감사하겠습니다.

depending크로 할 수 .isinstance어떤 종류의 오브젝트를 가지고 있는지, 그리고 대응하는 속성을 사용합니다.Python 2.6/3.0에 추상 기본 클래스가 도입되면서 이 접근법도 훨씬 강력해졌습니다(기본적으로 ABC는 더 정교한 오리 입력 방법을 허용합니다).

이것이 도움이 되는 한 가지 상황은 두 개의 서로 다른 객체가 같은 이름을 가지지만 다른 의미를 갖는 속성을 갖는 경우입니다.「」만 hasattr그러면 이상한 오류가 발생할 수 있습니다.

한 가지 좋은 예는 반복기와 반복기의 차이입니다(이 질문 참조).__iter__반복자의 메서드와 반복자의 메서드는 이름은 같지만 의미적으로는 상당히 다릅니다. ★★★★★★★★★★★★★★★★★.hasattrisinstanceABC 방송입니다.

의 경우, 지만, 부부 however, 의 in in in however 、 는 、 。hasattr접근법(기타 답변에 포함)이 가장 적절한 해결책입니다.

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

hasattr()를 사용합니다.

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

여기서도 마찬가지로 나는 getatr을 사용하여 자산을 취득하고 있다.재산이 없으면 아무것도 반환하지 않는다.

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

딕셔너리 이외의 오브젝트의 경우:

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

경우, ㅇㅇㅇㅇㅇㅇㅇ는,hasattr()동작하지 않습니다.

요.has_key()이치노그래서 사전을 위해서, 당신은 다음을 사용해야 합니다.has_attr()

if a.has_attr('property'):
    a['property']
 

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

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

요. 사용하세요. 냥냥사사사사사사dir( 표시)
그러면 개체의 사용 가능한 모든 함수 및 속성 목록이 반환됩니다.

하면 '어울리지 않다'가 할 수 있습니다.object는 Attribute를 합니다.hasattr빌트인 메서드

오브젝트가 다음과 같은 경우a.stuff

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

는 " " " 입니다.hasattr(object, name) -> bool, which, 약의 경우object에는 두 번째 인수에 전달되는 속성이 있습니다.hasattrTrue ★★★★★★★★★★★★★★★★★」Falsename츠요시

또 하나의 가능한 옵션입니다만, 그 전에 무엇을 의미하는지 여부에 따라 다릅니다.

undefined = object()

class Widget:

    def __init__(self):
        self.bar = 1

    def zoom(self):
        print("zoom!")

a = Widget()

bar = getattr(a, "bar", undefined)
if bar is not undefined:
    print("bar:%s" % (bar))

foo = getattr(a, "foo", undefined)
if foo is not undefined:
    print("foo:%s" % (foo))

zoom = getattr(a, "zoom", undefined)
if zoom is not undefined:
    zoom()

출력:

bar:1
zoom!

이를 통해 None-value Atribute를 확인할 수도 있습니다.

하지만! 실수로 인스턴스화하지 않도록 주의하고undefined, 왜냐하면 '복수'가 있기 때문입니다.is그런 경우엔 절대 효과가 없을 거야

업데이트:

위 단락에서 경고한 바와 같이 일치하지 않는 정의가 여러 개 있어 최근에 이 패턴을 약간 수정했습니다.

undefined = NotImplemented

NotImplemented「」와 주세요NotImplementedError합니다.JS에 대해서입니다.undefined그 정의를 어디서나 재사용할 수 있으며 항상 일치합니다.단점은 부울란에서는 "구질적"이며 로그 및 스택트레이스에서는 이상하게 보일 수 있다는 것입니다(단, 이 컨텍스트에서만 나타나는 것을 알고 있으면 금방 극복할 수 있습니다).

언급URL : https://stackoverflow.com/questions/610883/how-do-i-determine-if-an-object-has-an-attribute-in-python

반응형