파이썬에서 딕셔너리를 상속받아 "명명된 자료구조(Named Data Structure)"를 만들면, 키-값 구조를 가지는 데이터를 보다 직관적으로 다룰 수 있습니다. 이는 특히 키 이름을 데이터의 속성처럼 사용하고 싶을 때 유용합니다. 파이썬의 namedtuple과 유사한 방식으로 딕셔너리를 활용할 수 있지만, 딕셔너리 상속을 통해 커스텀 메서드나 동적 속성 추가 등이 가능합니다.

예제: 딕셔너리를 상속한 NamedDataCard 클래스

NamedDataCard 클래스는 딕셔너리를 상속받아 각 키를 속성처럼 접근할 수 있도록 하며, 데이터가 명확히 정의된 구조를 갖도록 할 수 있습니다. 예를 들어, 사람의 정보를 저장하는 명명된 자료구조를 만들 수 있습니다.

예제 코드:

# 딕셔너리 상속하여 명명된 자료구조 정의
class NamedDataCard(dict):
    # 데이터 카드 생성자
    def __init__(self, **kwargs):
        # 딕셔너리 초기화
        super().__init__(**kwargs)

    # 속성 접근을 가능하게 하기 위해 __getattr__과 __setattr__ 메서드 구현
    def __getattr__(self, name):
        # 딕셔너리 키를 속성처럼 접근 가능
        if name in self:
            return self[name]
        raise AttributeError(f"'NamedDataCard' object has no attribute '{name}'")

    def __setattr__(self, name, value):
        # 속성 설정을 딕셔너리 항목으로 저장
        self[name] = value

    # 특정 속성 출력 메서드
    def display_attributes(self):
        for key, value in self.items():
            print(f"{key}: {value}")

# 사용 예제
# NamedDataCard 객체 생성 (사람의 정보를 저장한다고 가정)
person = NamedDataCard(name="John Doe", age=30, occupation="Engineer")

# 속성처럼 데이터를 접근
print(f"Name: {person.name}")
print(f"Age: {person.age}")
print(f"Occupation: {person.occupation}")

# 데이터 수정 (속성처럼)
person.age = 31
print(f"Updated Age: {person.age}")

# 새로운 속성 추가
person.location = "New York"
print(f"Location: {person.location}")

# 모든 속성 출력
print("\nAll Attributes:")
person.display_attributes()

설명:

  1. NamedDataCard 클래스는 dict를 상속받고, 딕셔너리의 기본 기능을 유지하면서 키를 속성처럼 사용할 수 있도록 __getattr____setattr__ 메서드를 재정의했습니다.
  2. __getattr__person.name과 같은 형태로 딕셔너리의 키에 접근할 수 있도록 합니다.
  3. __setattr__은 새로운 속성을 추가하거나 값을 변경할 때 딕셔너리의 항목으로 자동 저장되도록 합니다.
  4. display_attributes() 메서드는 모든 속성(딕셔너리 항목)을 출력합니다.

실행 결과:

Name: John Doe
Age: 30
Occupation: Engineer
Updated Age: 31
Location: New York

All Attributes:
name: John Doe
age: 31
occupation: Engineer
location: New York

주요 포인트:

  • 이 클래스는 딕셔너리처럼 데이터를 저장하면서, 객체의 속성처럼 각 키에 접근할 수 있도록 만듭니다.
  • 이를 통해 명명된 자료구조(Named Data Structure)를 유연하게 사용할 수 있으며, 직관적인 인터페이스를 제공합니다.
  • 새로운 속성도 동적으로 추가할 수 있기 때문에, 데이터 구조를 확장하거나 수정하는 것이 간편합니다.

이 방식은 주로 직관적인 데이터 접근이 필요하거나, 데이터의 이름을 명확히 명명하고 관리하는 경우에 유용합니다.

+ Recent posts