파이썬에서 메타클래스는 클래스를 생성하는 데 사용되는 "클래스의 클래스"입니다. 메타데이터와 관련된 용도로 메타클래스를 활용하면 클래스 정의 시 자동으로 메타데이터를 추가하거나 검증 로직을 삽입할 수 있습니다.
다음은 메타데이터 관리 목적의 메타클래스 샘플 코드입니다:
# 메타데이터를 자동으로 추가하는 메타클래스
class MetaDataMeta(type):
def __new__(cls, name, bases, dct):
# 메타데이터를 클래스에 자동 추가
dct.setdefault('__metadata__', {})
dct['__metadata__']['created_at'] = datetime.now()
dct['__metadata__']['author'] = dct.get('__author__', 'Unknown')
dct['__metadata__']['version'] = dct.get('__version__', '1.0')
return super().__new__(cls, name, bases, dct)
def update_metadata(cls, key, value):
"""메타데이터 업데이트 메서드"""
if '__metadata__' not in cls.__dict__:
cls.__metadata__ = {}
cls.__metadata__[key] = value
# 메타클래스를 사용하는 데이터 클래스
class DataClass(metaclass=MetaDataMeta):
__author__ = "John Doe"
__version__ = "2.0"
def display_metadata(self):
"""현재 클래스의 메타데이터 출력"""
metadata = getattr(self.__class__, '__metadata__', {})
print(f"Metadata for {self.__class__.__name__}:")
for key, value in metadata.items():
print(f" {key}: {value}")
# 사용 예제
class MyData(DataClass):
pass
if __name__ == "__main__":
# MyData 클래스 생성 시 자동 메타데이터 삽입
my_data = MyData()
my_data.display_metadata()
# 메타데이터 업데이트
MyData.update_metadata('last_accessed', '2025-01-07')
my_data.display_metadata()
코드 설명
- MetaDataMeta 메타클래스:
- 클래스 정의 시 __metadata__라는 딕셔너리를 추가하여 기본 메타데이터를 설정.
- created_at, author, version 같은 기본 메타데이터를 자동으로 삽입.
- update_metadata 메서드를 통해 동적으로 메타데이터를 업데이트할 수 있음.
- DataClass 기반 클래스:
- 메타클래스로 MetaDataMeta를 사용하여 메타데이터 관리 기능을 상속.
- 사용 예제:
- MyData 클래스를 정의하면 MetaDataMeta가 자동으로 메타데이터를 삽입.
- update_metadata를 통해 메타데이터를 동적으로 업데이트 가능.
실행 결과 (예시):
Metadata for MyData:
created_at: 2025-01-07 12:00:00.123456
author: John Doe
version: 2.0
Metadata for MyData:
created_at: 2025-01-07 12:00:00.123456
author: John Doe
version: 2.0
last_accessed: 2025-01-07
이 메타클래스는 클래스 정의 시점에 메타데이터를 관리하고, 클래스의 공통적인 속성을 중앙에서 통제하기 위한 구조를 제공합니다.
'실용적인 코드 샘플' 카테고리의 다른 글
[실용적인 코드 샘플] 데이터 카드 패키지 압축 및 해제 (1) | 2025.01.08 |
---|---|
[실용적인 코드 샘플] 통계 정보를 포함하는 메타클래스 (0) | 2025.01.07 |
[실용적인 코드 샘플] `object` 클래스를 상속 사용자 정의 데이터 타입 (1) | 2024.10.23 |
[실용적인 코드 샘플] 히스토리 기반 통계 작성 클래스 (8) | 2024.10.22 |
[실용적인 코드 샘플] Way Point기반 시나리오 맵 자료구조 (10) | 2024.10.22 |