티스토리 뷰

이 글에서는 Python 코드 작성 중 흔히 마주치는 AttributeError—객체에 존재하지 않는 속성이나 메서드를 호출할 때 발생하는 예외의 정의와 발생 원인, 실습 예제, 해결 방법을 단계별로 살펴봅니다. 직관적인 코드 예제와 디버깅 팁을 통해 문제를 빠르게 진단하고 수정하는 방법을 익힐 수 있으며, 다음 챕터에서는 UnboundLocalError: 지역변수 참조 전에 사용 문제를 다룰 예정이니 많은 기대 바랍니다.

1. AttributeError란?

AttributeError는 파이썬 인터프리터가 객체에 요청한 속성(attribute)이나 메서드(method)가 정의되어 있지 않을 때 발생하는 내장 예외입니다. 예를 들어, 리스트(list) 객체에 문자열 관련 메서드를 호출하거나, 사용자 정의 클래스 인스턴스에 없는 속성에 접근하면 이 예외가 발생합니다. Python은 동적 타이핑 언어로 다양한 객체를 자유롭게 다룰 수 있지만, 객체별로 제공하는 속성과 메서드가 미리 정의되어 있어야 올바르게 동작합니다. 속성이나 메서드를 잘못 오타로 입력했거나, 상속·초기화 과정에서 대상 객체에 해당 멤버를 설정하지 않은 경우 바로 AttributeError가 발생해 코드 실행이 중단됩니다. 에러 메시지에는 “'ClassName' object has no attribute 'attribute_name'” 형식으로 출력되어 어느 객체에서 어떤 속성이 호출되었는지 명확히 알려줍니다.

2. 실습 예제

아래 코드를 실행하면 AttributeError가 발생하는 대표적인 상황을 확인할 수 있습니다.

# 예제 1: 리스트에 없는 메서드 호출
items = [1, 2, 3]
items.append_left(0)  # AttributeError: 'list' object has no attribute 'append_left'

# 예제 2: 사용자 클래스에 없는 속성 접근
class Person:
    def __init__(self, name):
        self.name = name

p = Person("Alice")
print(p.age)  # AttributeError: 'Person' object has no attribute 'age'

3. 실행 결과 및 설명

터미널에 다음과 같은 메시지가 출력됩니다:

Traceback (most recent call last):
  File "example.py", line 3, in 
    items.append_left(0)
AttributeError: 'list' object has no attribute 'append_left'

Traceback (most recent call last):
  File "example.py", line 9, in 
    print(p.age)
AttributeError: 'Person' object has no attribute 'age'

첫 번째 예제는 올바른 메서드 이름인 append 대신 존재하지 않는 append_left를 호출하여, 두 번째 예제는 Person 클래스에 정의되지 않은 age 속성에 접근해 발생합니다.

4. 해결 방법 & 디버깅 팁

  1. 속성·메서드 오타 점검: 에러 메시지에 표시된 이름과 코드 내 정의를 정확히 비교하세요.
  2. dir() 함수 활용: dir(obj)로 객체가 지원하는 모든 멤버 목록을 확인합니다.
  3. 초기화 검토: 클래스의 __init__ 메서드에서 필요한 속성을 모두 정의했는지 확인하세요.
  4. 상속 구조 확인: 부모 클래스에 정의된 속성을 자식 클래스가 올바르게 상속받았는지 검토합니다.
  5. getattr() 사용: 동적 속성 접근이 필요할 때는 getattr(obj, 'attr', default)로 기본값을 지정할 수 있습니다.
  6. IDE·린터 활용: PyCharm, VS Code의 IntelliSense나 lint 기능으로 미리 경고를 받으세요.

5. 정리 및 다음 단계

이번 챕터에서는 AttributeError의 정의, 발생 원인, 실습 예제 및 해결 방법을 살펴보았습니다. 속성 오타, 초기화 누락, 잘못된 상속 구조가 주요 원인이므로, 에러 메시지와 dir() 함수를 적극 활용해 문제 지점을 빠르게 파악하세요. 다음 챕터에서는 UnboundLocalError: 지역변수 참조 전에 사용 문제를 다룰 예정입니다.