데이터 카드에 헤더 카드를 생성하기 위한 메타클래스를 작성하여, 클래스가 정의될 때 자동으로 공통 헤더 정보를 설정하도록 할 수 있습니다. 아래는 헤더 카드 목적의 메타클래스를 구현한 샘플 코드입니다.


헤더 카드 메타클래스 코드

from datetime import datetime

class HeaderMeta(type):
    """헤더 카드를 생성하는 메타클래스"""
    def __new__(cls, name, bases, dct):
        # 헤더 정보 기본값 추가
        dct.setdefault("__header__", {
            "author": "Unknown",
            "version": "1.0",
            "created_at": datetime.now(),
            "description": f"{name} description not provided.",
        })
        return super().__new__(cls, name, bases, dct)

    def set_header(cls, key, value):
        """헤더 정보 설정"""
        if "__header__" in cls.__dict__:
            cls.__header__[key] = value
        else:
            raise AttributeError("Header not defined in the class.")

    def get_header(cls):
        """헤더 정보 가져오기"""
        return cls.__header__

class DataCard(metaclass=HeaderMeta):
    """헤더 카드를 포함하는 데이터 카드"""
    def __init__(self, name, data):
        self.name = name
        self.data = data

    def display(self):
        """데이터 카드 정보 출력"""
        print(f"Data Card: {self.name}")
        print(f"Data: {self.data}")

    @classmethod
    def display_header(cls):
        """헤더 정보 출력"""
        print("Header Information:")
        for key, value in cls.__header__.items():
            print(f"  {key}: {value}")

# 사용 예제
if __name__ == "__main__":
    # 기본 헤더 자동 설정
    print("Default Header:")
    DataCard.display_header()

    # 헤더 수정
    DataCard.set_header("author", "John Doe")
    DataCard.set_header("description", "A general-purpose data card.")
    DataCard.set_header("version", "2.0")

    print("\nUpdated Header:")
    DataCard.display_header()

    # 데이터 카드 생성
    card = DataCard(name="Sample Data", data={"key": "value"})
    print("\nCard Details:")
    card.display()

코드 설명

  1. HeaderMeta 메타클래스:
    • 클래스 정의 시 __header__라는 공통 헤더를 자동으로 생성.
    • __header__ 기본값에는 작성자, 버전, 생성 시간, 설명 등을 포함.
    • set_header 메서드: 헤더 값을 업데이트할 수 있음.
    • get_header 메서드: 현재 클래스의 헤더 정보를 반환.
  2. DataCard 클래스:
    • HeaderMeta 메타클래스를 기반으로 작성된 데이터 카드 클래스.
    • 클래스 수준에서 헤더 정보를 관리하며, 인스턴스 수준의 데이터와는 분리.
  3. 사용 예제:
    • 기본 헤더를 확인하고, set_header 메서드를 사용하여 헤더 값을 수정.
    • 데이터 카드를 생성하여 데이터와 헤더를 각각 출력.

실행 결과 (예시):

Default Header:
Header Information:
  author: Unknown
  version: 1.0
  created_at: 2025-01-07 12:00:00.123456
  description: DataCard description not provided.

Updated Header:
Header Information:
  author: John Doe
  version: 2.0
  created_at: 2025-01-07 12:00:00.123456
  description: A general-purpose data card.

Card Details:
Data Card: Sample Data
Data: {'key': 'value'}

주요 기능

  • 헤더 자동 생성: 클래스 정의 시 기본 헤더가 자동으로 설정.
  • 헤더 수정 가능: 클래스 수준에서 헤더 정보를 동적으로 수정 가능.
  • 클래스와 인스턴스 데이터 분리: 헤더는 클래스 수준에서 관리하며, 인스턴스 데이터와 독립적.

이 메타클래스는 데이터 카드와 같은 객체의 공통 메타데이터(헤더 정보)를 관리하는 데 적합하며, 코드의 일관성을 유지하면서도 유연한 확장을 가능하게 합니다.

+ Recent posts