개체에 속성이 있는지 확인하려면 어떻게 해야 합니까?
개체에 속성이 있는지 확인하려면 어떻게 해야 합니까?예:
>>> 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또는False의 name개체의 속성입니다.
다른 가능한 옵션이지만, 이전에 의미하는 바가 무엇인지에 따라 다릅니다.
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
'programing' 카테고리의 다른 글
| C++/CLI에서 캐럿('^')은 무엇을 의미합니까? (0) | 2023.05.18 |
|---|---|
| 날짜를 숫자 형식의 엑셀에서 날짜 형식의 파이썬으로 변환 (0) | 2023.05.18 |
| 계속하기 전에 셸 스크립트를 잠시 일시 중지하려면 어떻게 해야 합니까? (0) | 2023.05.18 |
| 이 맨 저장소로 푸시할 수 없는 이유는 무엇입니까? (0) | 2023.05.18 |
| 작은 Azure 저장 블롭 용기(각각 몇 개의 블롭이 있는 용기)가 많은 것이 좋습니까, 아니면 정말 큰 블롭 용기가 많은 것이 좋습니까? (0) | 2023.05.18 |