파이썬에서 메타클래스는 클래스를 생성하는 데 사용되는 "클래스의 클래스"입니다. 메타데이터와 관련된 용도로 메타클래스를 활용하면 클래스 정의 시 자동으로 메타데이터를 추가하거나 검증 로직을 삽입할 수 있습니다.

다음은 메타데이터 관리 목적의 메타클래스 샘플 코드입니다:

# 메타데이터를 자동으로 추가하는 메타클래스
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()

코드 설명

  1. MetaDataMeta 메타클래스:
    • 클래스 정의 시 __metadata__라는 딕셔너리를 추가하여 기본 메타데이터를 설정.
    • created_at, author, version 같은 기본 메타데이터를 자동으로 삽입.
    • update_metadata 메서드를 통해 동적으로 메타데이터를 업데이트할 수 있음.
  2. DataClass 기반 클래스:
    • 메타클래스로 MetaDataMeta를 사용하여 메타데이터 관리 기능을 상속.
  3. 사용 예제:
    • 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

이 메타클래스는 클래스 정의 시점에 메타데이터를 관리하고, 클래스의 공통적인 속성을 중앙에서 통제하기 위한 구조를 제공합니다.

+ Recent posts