파이썬에서 딕셔너리를 상속받아 "명명된 자료구조(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()
설명:
NamedDataCard
클래스는dict
를 상속받고, 딕셔너리의 기본 기능을 유지하면서 키를 속성처럼 사용할 수 있도록__getattr__
과__setattr__
메서드를 재정의했습니다.__getattr__
은person.name
과 같은 형태로 딕셔너리의 키에 접근할 수 있도록 합니다.__setattr__
은 새로운 속성을 추가하거나 값을 변경할 때 딕셔너리의 항목으로 자동 저장되도록 합니다.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)를 유연하게 사용할 수 있으며, 직관적인 인터페이스를 제공합니다.
- 새로운 속성도 동적으로 추가할 수 있기 때문에, 데이터 구조를 확장하거나 수정하는 것이 간편합니다.
이 방식은 주로 직관적인 데이터 접근이 필요하거나, 데이터의 이름을 명확히 명명하고 관리하는 경우에 유용합니다.
'실용적인 자료구조' 카테고리의 다른 글
[실용적인 자료구조] 더블 언더 메소드와 그 역할 (0) | 2024.10.17 |
---|---|
[실용적인 자료구조] 이중 연결 리스트(Doubly Linked List) (0) | 2024.10.17 |
[실용적인 자료구조] Python의 `object` 클래스 1 (0) | 2024.10.17 |
[실용적인 자료구조] 리스트를 상속한 `NamedList` 클래스 (1) | 2024.10.16 |
[실용적인 자료구조] 명명된 자료구조 1 (0) | 2024.10.15 |