Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python AttributeError 완벽 해결 가이드

속성(Attribute)은 객체, 데이터 타입 또는 클래스에 연결된 값이나 함수를 의미합니다. 해당 속성을 지원하지 않는 데이터 타입이나 클래스의 객체에 대해 속성을 호출하면 AttributeError가 발생합니다.


이 가이드에서는 AttributeError가 무엇이고 어떤 의미를 갖는지 살펴보고, 실제 예제를 통해 코드에서 이 오류를 수정하는 방법까지 단계별로 알아보겠습니다.

Python AttributeError란?

Python에서 AttributeError는 객체의 데이터 타입이 지원하지 않는 메서드나 속성을 호출할 때 발생하는 오류입니다. 예를 들어, 문자열에는 append() 메서드를 사용할 수 없기 때문에 문자열에 append()를 호출하면 AttributeError가 발생합니다.

Python 클래스에서는 해당 클래스의 객체들이 공유하는 메서드와 값을 정의할 수 있습니다. 그래서 많은 사람들이 클래스를 객체의 설계도(blueprint)라고 생각합니다.

메서드나 클래스를 호출한다는 것은 곧 그 클래스의 속성을 참조한다는 뜻입니다. 속성을 쉽게 이해하려면 사람의 신체적 특징을 떠올려 보세요. 어떤 사람은 파란 눈을 가지고 있고, 어떤 사람은 분홍색으로 염색한 머리를 하고 있습니다. 이것들이 모두 속성입니다.

Python 클래스에서 속성은 "eye_color"(눈 색깔)처럼 값을 나타낼 수도 있고, 함수일 수도 있습니다. 예를 들어 changeEyeColor()라는 함수는 "eye_color" 속성의 값을 변경하는 역할을 할 수 있습니다.

데이터 타입 역시 속성을 가집니다. 예를 들어 Python의 join() 메서드를 사용하면 문자열을 리스트로 변환할 수 있습니다. 문자열 객체는 join() 메서드를 지원하기 때문입니다.

반면, 클래스 객체나 데이터 타입과 연관되지 않은 함수나 값을 참조하려고 하면 AttributeError가 발생합니다.

AttributeError 발생 예시

두 개의 신발 목록을 병합하는 프로그램을 작성해 보겠습니다. 두 신발 매장이 합병을 진행 중이며, 두 매장에서 판매하는 고유한 신발 상품 전체를 하나의 목록으로 만들고자 합니다.

먼저 첫 번째 매장인 'Harrisons Shoes'의 신발을 담은 Python 집합(set)을 정의합니다:

harrisons_shoes = {"Nike Air Force 1 07", "Nike Air Max Plus", "Adidas Gazelle"}

중괄호({})를 사용하여 집합을 정의했습니다. 다음으로 Harrisons와 합병하는 매장인 'Shoe Emporium'의 신발 이름을 담은 집합을 정의합니다:

shoe_emporium = {"Adidas Samba", "Adidas Superstar", "Nike Air Max Plus"}

이 두 컬렉션은 집합이므로 중복되지 않는 고유한 값만 저장할 수 있습니다. 즉, 두 집합을 합치면 중복 값이 없는 집합이 만들어집니다.

두 집합을 합치기 위해 내장 메서드인 extend()를 사용해 보겠습니다:

harrisons_shoes.extend(shoe_emporium)
print(harrisons_shoes)

extend() 메서드는 "shoe_emporium" 집합의 모든 신발을 "harrisons_shoes" 집합에 추가합니다. 그리고 print() 문을 사용해 새로운 집합에 포함된 모든 신발을 확인할 수 있습니다. 코드를 실행해 보면:

Traceback (most recent call last):
File "main.py", line 3, in <module>
harrisons_shoes.extend(shoe_emporium)
AttributeError: 'set' object has no attribute 'extend'

코드 실행 결과 AttributeError가 반환됩니다.

AttributeError 해결 방법

오류 메시지를 보면 데이터 타입이 set(집합)인 객체에는 extend() 메서드를 사용할 수 없다고 안내하고 있습니다. extend()는 리스트(list) 전용 메서드이며, 집합에서는 지원하지 않기 때문입니다.

두 집합을 병합하려면 집합 전용 메서드인 update()를 사용해야 합니다:

harrisons_shoes.update(shoe_emporium)
print(harrisons_shoes)

update() 메서드는 "shoe_emporium" 집합의 모든 요소를 "harrisons_shoes" 집합에 추가합니다. 이후 "harrisons_shoes" 집합의 모든 값을 콘솔에 출력합니다. 새로운 프로그램을 실행해 보면:

{'Nike Air Force 1 07', 'Adidas Superstar', 'Adidas Samba', 'Nike Air Max Plus', 'Adidas Gazelle'}

프로그램이 원래 두 집합의 모든 신발을 포함한 집합을 반환합니다. 처음 두 집합에는 총 여섯 개의 값이 있었지만, 결과 집합에는 다섯 개만 남아 있습니다. 'Nike Air Max Plus'가 두 집합에 중복으로 포함되어 있었고, 집합은 고유한 값만 저장할 수 있기 때문입니다.

함께 살펴볼 유사한 AttributeError 사례

AttributeError는 매우 흔하게 발생하는 오류입니다. 지원하지 않는 속성을 데이터 타입이나 클래스의 객체에 호출하려 할 때마다 나타날 수 있습니다.

또한 속성 이름을 잘못 입력(오타)한 경우에도 이 오류가 발생할 수 있습니다. Python은 작성된 코드를 그대로 해석하기 때문에 오타가 있으면 존재하지 않는 속성을 참조하는 것으로 인식합니다.

예를 들어 split() 메서드로 리스트를 분할하려는 시도가 흔합니다. 하지만 split()은 문자열 메서드이므로 리스트를 분할하는 데 사용할 수 없습니다.

추가로 학습해 볼 만한 관련 오류는 다음과 같습니다:

  • AttributeError: 'list' object has no attribute 'split'
  • AttributeError: 'module' object has no attribute 'urlopen'

마무리

Python의 AttributeError는 유효하지 않은 속성을 참조할 때 발생합니다. 이 오류를 해결하려면 먼저 호출하려는 속성이 실제로 존재하는지 확인하세요. 그다음, 해당 속성이 작업 중인 객체나 데이터 타입과 관련이 있는지 점검해야 합니다.

찾으려는 속성이 내장 타입에 존재하지 않는다면 대안을 찾아야 합니다. 한 데이터 타입에 있는 많은 속성들은 다른 데이터 타입에서도 비슷한 기능을 하는 대체 메서드가 존재합니다. 예를 들어 집합에는 extend() 메서드가 없지만, union()을 사용해 두 집합을 합칠 수 있습니다.

Python 코딩을 더 깊이 배우고 싶다면 Python 학습 가이드를 참고해 보세요.