데이터 카드를 여러 개 저장하고 이를 효율적으로 관리하기 위해서는 DataCard 객체를 리스트로 관리하고, 특정 조건에 따라 카드를 검색하는 기능이 필요합니다. 이를 구현하기 위해 DataCardList 클래스를 만들고, 이 클래스에 데이터를 저장하고 검색하는 기능을 추가할 수 있습니다.

설계

  1. DataCardList 클래스: 여러 DataCard 객체를 리스트로 저장하고, 검색 기능을 포함하는 클래스입니다.
  2. 검색 기능: 특정 속성 값 또는 카드 이름을 기준으로 카드를 검색할 수 있는 메서드를 추가합니다. 예를 들어, name을 기준으로 카드를 찾거나, 특정 속성(예: attack)이 일정 값 이상인 카드를 찾을 수 있습니다.

예제 코드

class DataCard(dict):
    def __init__(self, name, description, attributes=None):
        """
        name: 카드의 이름
        description: 카드에 대한 설명
        attributes: 카드의 속성 (딕셔너리 형태)
        """
        super().__init__()
        self['name'] = name
        self['description'] = description
        self['attributes'] = attributes if attributes is not None else {}

    def add_attribute(self, key, value):
        """카드에 새로운 속성을 추가"""
        self['attributes'][key] = value

    def get_attribute(self, key):
        """특정 속성 값을 조회"""
        return self['attributes'].get(key, 'Attribute not found')

    def __repr__(self):
        """카드의 간단한 정보를 출력"""
        return f"DataCard(name={self['name']!r}, description={self['description']!r}, attributes={self['attributes']})"


class DataCardList:
    def __init__(self):
        """DataCard 객체들을 저장하는 리스트"""
        self.cards = []

    def add_card(self, card):
        """리스트에 새 카드 추가"""
        if isinstance(card, DataCard):
            self.cards.append(card)
        else:
            raise ValueError("Only DataCard instances can be added")

    def search_by_name(self, name):
        """카드 이름으로 검색"""
        return [card for card in self.cards if card['name'] == name]

    def search_by_attribute(self, key, value):
        """카드 속성 값으로 검색 (정확히 일치하는 속성 값)"""
        return [card for card in self.cards if card.get('attributes', {}).get(key) == value]

    def search_by_attribute_range(self, key, min_value=None, max_value=None):
        """
        속성 값의 범위로 검색 (min_value 이상, max_value 이하)
        """
        result = []
        for card in self.cards:
            attr_value = card.get('attributes', {}).get(key)
            if attr_value is not None:
                if (min_value is None or attr_value >= min_value) and (max_value is None or attr_value <= max_value):
                    result.append(card)
        return result

    def __repr__(self):
        """리스트의 모든 카드 정보 출력"""
        return f"DataCardList({self.cards})"


# 예제 사용
# 데이터 카드 생성
card1 = DataCard(
    name="Magic Card",
    description="A powerful magic card.",
    attributes={'attack': 10, 'defense': 8, 'mana_cost': 5}
)

card2 = DataCard(
    name="Warrior Card",
    description="A brave warrior card.",
    attributes={'attack': 15, 'defense': 12, 'mana_cost': 7}
)

card3 = DataCard(
    name="Healing Card",
    description="A card with healing abilities.",
    attributes={'heal': 20, 'mana_cost': 4}
)

# 데이터 카드 리스트 생성
card_list = DataCardList()
card_list.add_card(card1)
card_list.add_card(card2)
card_list.add_card(card3)

# 카드 이름으로 검색
print("Name search - 'Warrior Card':")
print(card_list.search_by_name("Warrior Card"))  # Warrior Card 찾기

# 특정 속성으로 검색 (정확히 일치하는 값)
print("\nAttribute search - 'mana_cost' == 5:")
print(card_list.search_by_attribute('mana_cost', 5))  # 마나 비용이 5인 카드 찾기

# 속성 범위로 검색
print("\nAttribute range search - 'attack' between 10 and 15:")
print(card_list.search_by_attribute_range('attack', min_value=10, max_value=15))  # 공격력이 10 이상 15 이하인 카드 찾기

코드 설명

  1. DataCard 클래스: 이전에 정의한 카드 데이터 모델입니다. 각 카드는 이름(name), 설명(description), 속성(attributes)을 가집니다. 속성은 딕셔너리 형태로 저장됩니다.

  2. DataCardList 클래스:

    • 이 클래스는 여러 DataCard 객체를 리스트로 저장하는 역할을 합니다.
    • add_card(card): DataCard 객체를 리스트에 추가합니다. 추가하려는 객체가 DataCard 클래스의 인스턴스가 아닌 경우, 예외를 발생시킵니다.
    • search_by_name(name): 카드의 이름으로 검색합니다. 주어진 이름과 정확히 일치하는 카드를 리스트로 반환합니다.
    • search_by_attribute(key, value): 주어진 속성 키와 값으로 카드를 검색합니다.
    • search_by_attribute_range(key, min_value, max_value): 주어진 속성의 값을 기준으로 범위 내에 속하는 카드를 검색합니다. 최소값(min_value)과 최대값(max_value)을 지정할 수 있으며, 범위 필터링이 가능합니다.
  3. 검색 기능:

    • 이름으로 검색하는 기능을 통해 정확히 일치하는 카드를 찾습니다.
    • 특정 속성의 값을 기준으로 카드를 찾을 수 있습니다(예: 마나 비용이 5인 카드).
    • 속성 값의 범위를 기준으로 카드를 검색할 수 있습니다(예: 공격력이 10 이상, 15 이하인 카드).

실행 결과

Name search - 'Warrior Card':
[DataCard(name='Warrior Card', description='A brave warrior card.', attributes={'attack': 15, 'defense': 12, 'mana_cost': 7})]

Attribute search - 'mana_cost' == 5:
[DataCard(name='Magic Card', description='A powerful magic card.', attributes={'attack': 10, 'defense': 8, 'mana_cost': 5})]

Attribute range search - 'attack' between 10 and 15:
[DataCard(name='Magic Card', description='A powerful magic card.', attributes={'attack': 10, 'defense': 8, 'mana_cost': 5}),
 DataCard(name='Warrior Card', description='A brave warrior card.', attributes={'attack': 15, 'defense': 12, 'mana_cost': 7})]

확장 가능성

이 구조를 기반으로 다양한 기능을 추가할 수 있습니다:

  • 정렬 기능: 특정 속성을 기준으로 카드들을 정렬하는 기능.
  • 필터링: 여러 속성을 기준으로 필터링하는 기능.
  • 카드 업데이트: 특정 카드를 찾아 그 속성을 업데이트하거나 삭제하는 기능.

이와 같은 방식으로 DataCard 모델과 리스트 관리 클래스를 확장하여 더 복잡한 데이터 모델을 쉽게 구현할 수 있습니다.

+ Recent posts