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

파이썬 내장 클래스 속성 __dict__의 역할과 사용법

__dict__란 무엇인가?

파이썬에서 모든 객체와 클래스는 __dict__라는 특수 속성을 가지고 있습니다. 이는 해당 객체나 모듈의 심볼 테이블(symbol table)을 담고 있는 딕셔너리로, 객체의 쓰기 가능한(writable) 속성들을 저장하는 매핑(mapping) 객체 역할을 합니다.

object.__dict__

쉽게 말해, __dict__는 객체 내부에 어떤 속성들이 정의되어 있는지 한눈에 확인할 수 있는 사전형 구조입니다. 인스턴스별 고유 속성과 클래스 레벨의 공통 속성을 구분해서 보여주기 때문에, 파이썬의 객체 모델을 이해하는 데 매우 유용한 도구입니다.

기본 예제 코드

아래 코드는 __dict__가 실제로 어떻게 동작하는지 보여줍니다.

class MyClass(object):
    class_var = 1

    def __init__(self, i_var):
        self.i_var = i_var

foo = MyClass(2)
bar = MyClass(3)

print MyClass.__dict__
print foo.__dict__
print bar.__dict__

실행 결과 분석

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

{'__module__': '__main__', 'class_var': 1, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, '__doc__': None, '__init__': <function __init__ at 0x0000000004E55CF8>}
{'i_var': 2}
{'i_var': 3}

결과 해석

클래스의 __dict__: MyClass.__dict__에는 클래스 변수인 class_var, 그리고 __module__, __init__, __doc__, __weakref__ 등 파이썬이 자동으로 생성하는 특수 속성들이 포함되어 있습니다. 즉, 클래스에 정의된 모든 것들이 이 딕셔너리에 기록됩니다.

인스턴스의 __dict__: 반면 foo.__dict__와 bar.__dict__는 각각 {'i_var': 2}, {'i_var': 3}만 담고 있습니다. 생성자(__init__)를 통해 각 인스턴스에 할당된 인스턴스 변수만 저장되는 것입니다.

핵심 정리

이 예제에서 알 수 있는 중요한 점은 다음과 같습니다.

- 클래스의 __dict__는 클래스 변수와 메서드 등 모든 클래스 멤버를 포함합니다.
- 인스턴스의 __dict__는 해당 인스턴스에만 존재하는 개별 속성만 저장합니다.
- class_var처럼 클래스 레벨에 정의된 변수는 인스턴스의 __dict__에는 나타나지 않으며, 속성 조회 시 클래스의 __dict__에서 검색됩니다.

이러한 동작 방식은 파이썬의 속성 탐색 순서(인스턴스 → 클래스 → 부모 클래스)와 밀접한 관련이 있으므로, 객체 지향 프로그래밍을 깊이 이해하고자 한다면 __dict__의 구조를 반드시 숙지하는 것이 좋습니다.