programing

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

elecom 2023. 5. 18. 20:44
반응형

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

개체에 속성이 있는지 확인하려면 어떻게 해야 합니까?예:

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

용서를 구하는 것에 대해 좋은 조언을 제공하는 아래의 zweiterelinde의 대답을 보세요!매우 부정적인 접근법!

python의 일반적인 관행은 속성이 대부분의 시간 동안 존재할 가능성이 높은 경우 속성을 호출하여 예외를 전파하거나 try/except 블록으로 트랩하는 것입니다. 이작은다더빠다릅니다보음업다▁be▁than보다 빠를 입니다.hasattr잘 속이거없가높확거실나않지하다사경다니합용음을우를 합니다.hasattr반복적으로 예외 블록에 빠지는 것보다 더 빠를 수 있습니다.

자렛 하디가 대답하자,hasattr 사람들이 에 봐이 더 전략을 덧붙이고 .하지만 저는 파이썬 커뮤니티의 많은 사람들이 "뛰기 전에 보기"(LBILL)보다 "허락보다 용서를 구하는 것이 더 쉽다"(EAFP)는 전략을 추천한다는 것을 덧붙이고 싶습니다.다음 참조를 참조하십시오.

EAFP vs LBIL (Re: 지금까지 약간 실망했습니다)
EAFP 대 LBIL @Pythonista와 같은 코드:관용 파이썬

i:

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

선호되는 기능:

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

사용할 수 있습니다.hasattr() 는또캐치를 잡으세요.AttributeError그러나 속성 값이 없는 경우 기본값만 사용하려면 다음을 사용하는 것이 가장 좋습니다.

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)을 호출하고 예외를 포착합니다.따라서 사전에 hastr()을 사용하는 것과 마찬가지로 속성 액세스를 try 문으로 래핑하고 AttributeError를 잡는 것도 유효합니다.

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

이 문제를 피할 것을 제안합니다.

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

했습니다: an @jpalecek 파일: 만AttributeError내부에서 발생합니다.doStuff()당신은 길을 잃었습니다.

이 접근 방식이 더 나을 수도 있습니다.

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

사전이 아닌 개체의 경우:

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

경우에는, 경우의사전,hasattr()작동하지 않습니다.

이 많은사사용말합다니고라하이람들말다▁use▁to합니▁many▁telling▁people많을 사용하라고 말하고 있습니다.has_key()사전용이지만 감가상각됩니다.그래서 사전을 위해서, 당신은 사용해야 합니다.has_attr()

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

또는 사용할 수 있습니다.

if 'property' in a:

hasattr()정니다입답. 제가 싶은 은 덧고싶은것은이입니다.hasattr()(불필요한 것을 피하기 위해) 주장과 함께 잘 사용할 수 있습니다.if명령문을 사용하여 코드를 보다 쉽게 읽을 수 있도록 설정):

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

속성이 누락된 경우 프로그램이 종료되고 다음 메시지가 표시됩니다.AssertionError합니다.object lacks property이 경우).

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

Asserts는 절대 발생해서는 안 되는 조건을 테스트하는 데 사용해야 합니다.이 목적은 손상된 프로그램 상태의 경우 조기에 충돌하는 것입니다.

종종 이것은 속성이 없어진 경우에 해당합니다. 그리고 나서assert매우 적절합니다.

편집: 이 접근 방식에는 심각한 제한이 있습니다.개체가 반복 가능한 개체라면 작동해야 합니다.아래의 댓글을 확인해주시기 바랍니다.

처럼 Python 3.6 이상을 사용하는 경우 객체에 특정 속성이 있는지 확인할 수 있는 편리한 대안이 있습니다.

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

하지만 지금은 어떤 방법이 최선인지 잘 모르겠습니다.사용.hasattr()를 사용합니다.getattr() 는사용을 사용합니다.in댓글은 환영합니다.

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

hastratr() 사용

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

여기서도 마찬가지입니다. 속성이 없으면 속성을 얻기 위해 gettrr을 사용하고 있습니다.

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

확할수있상따에서 할 수 .isinstance사용자가 가지고 있는 개체 유형을 선택한 다음 해당 속성을 사용합니다.Python 2.6/3.0에 추상 기본 클래스가 도입되면서 이 접근 방식도 훨씬 강력해졌습니다(기본적으로 ABC는 오리 타이핑의 더 정교한 방법을 허용합니다).

이것이 유용한 한 가지 상황은 두 개의 다른 개체가 동일한 이름을 가지지만 다른 의미를 가진 속성을 가지고 있는 경우입니다.만 사용hasattr그러면 이상한 오류가 발생할 수 있습니다.

한 가지 좋은 예는 반복자와 반복자의 구별입니다(이 질문 참조).__iter__반복기와 반복기의 메서드는 이름이 같지만 의미적으로 상당히 다릅니다!그렇게hasattr 소없지만만하, 지용만▁is하.isinstanceABC와 함께 깨끗한 해결책을 제공합니다.

에서 하만대의,▁in서상▁that황▁agree에,에 동의합니다.hasattr접근 방식(다른 답변에서 설명)이 가장 적합한 솔루션입니다.

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

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

가 사전인 경우 정상적으로 확인할 수 있습니다.

if 'property' in a:
    a.property

간단하기 에, 그냥 사용하세요. 그냥 사용하세요.dir()
그러면 개체의 사용 가능한 모든 함수 및 특성 목록이 반환됩니다.

하스트레을 사용하여 Python에서 객체 또는 클래스에 속성이 있는지 확인할 수 있습니다.

예를 들어 아래와 같은 클래스가 있습니다.

class Person:
    greeting = "Hello"

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def test(self):
        print("Test")

그런 다음 아래와 같이 개체에 대해 하스트라르트을 사용할 수 있습니다.

obj = Person("John", 27)
obj.gender = "Male"
print("greeting:", hasattr(obj, 'greeting'))
print("name:", hasattr(obj, 'name'))
print("age:", hasattr(obj, 'age'))
print("gender:", hasattr(obj, 'gender'))
print("test:", hasattr(obj, 'test'))
print("__init__:", hasattr(obj, '__init__'))
print("__str__:", hasattr(obj, '__str__'))
print("__module__:", hasattr(obj, '__module__'))

출력:

greeting: True
name: True
age: True
gender: True
test: True
__init__: True
__str__: True
__module__: True

또한 다음과 같이 클래스 이름하스트레을 직접 사용할 수도 있습니다.

print("greeting:", hasattr(Person, 'greeting'))
print("name:", hasattr(Person, 'name'))
print("age:", hasattr(Person, 'age'))
print("gender:", hasattr(Person, 'gender'))
print("test:", hasattr(Person, 'test'))
print("__init__:", hasattr(Person, '__init__'))
print("__str__:", hasattr(Person, '__str__'))
print("__module__:", hasattr(Person, '__module__'))

출력:

greeting: True
name: False
age: False
gender: False
test: True
__init__: True
__str__: True
__module__: True

여부를 확인할 수 있습니다.object에는 를사여속포함다니합성을 이 포함되어 .hasattr붙박이 방식

를 들어, 의 목적어가 예들어, 당의목적입니다.a은 속성 " 고를원합다기확하인성속을당"를 확인하려고 .stuff

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

는 메드서자다같습다니과음는체입니다.hasattr(object, name) -> bool그 말은 만약에object의 두 번째 인수로 전달되는 특성이 있습니다.hasattr불리언을 제공하는 것보다True또는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!

이렇게 하면 값이 지정되지 않은 속성도 확인할 수 있습니다.

하지만! 실수로 인스턴스화하고 비교하지 않도록 매우 조심하세요.undefined여러 장소들 왜냐하면is그런 경우에는 절대로 효과가 없을 겁니다

업데이트:

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

undefined = NotImplemented

NotImplemented와 혼동하지 않는NotImplementedError와 반 합니다.undefined정의를 어디서나 재사용할 수 있으며 항상 일치합니다.단점은 불리언에서 "사실"이고 로그 및 스택 추적에서 이상하게 보일 수 있다는 것입니다(그러나 이 컨텍스트에만 표시된다는 것을 알면 빠르게 극복할 수 있습니다).

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

반응형