Инкапсуляция позволяет скрыть внутреннюю реализацию класса и предоставить контролируемый доступ к данным.
class Artifact:
def __init__(self, name: str, rarity: int):
self.name = name # Публичный атрибут
self._rarity = rarity # Защищённый атрибут
self.__level = 0 # Приватный атрибут
self.__substats = [] # Приватный атрибут
@property
def rarity(self) -> int:
"""Свойство для чтения редкости артефакта"""
return self._rarity
@property
def level(self) -> int:
"""Свойство для чтения уровня"""
return self.__level
@level.setter
def level(self, value: int) -> None:
"""Контролируемое изменение уровня"""
if not (0 <= value <= 20):
raise ValueError("Уровень должен быть от 0 до 20")
self.__level = value
class Artifact:
def __str__(self) -> str:
"""Строковое представление для print()"""
return f"{self.name} +{self.__level}"
def __repr__(self) -> str:
"""Подробное представление для отладки"""
return f"Artifact(name='{self.name}', rarity={self._rarity}, level={self.__level})"
def __eq__(self, other: 'Artifact') -> bool:
"""Сравнение артефактов"""
if not isinstance(other, Artifact):
return NotImplemented
return (self.name == other.name and
self._rarity == other._rarity)
def __lt__(self, other: 'Artifact') -> bool:
"""Сравнение по редкости и уровню"""
if not isinstance(other, Artifact):
return NotImplemented
return (self._rarity, self.__level) < (other._rarity, other.__level)
class ArtifactStats:
def __init__(self, base_value: float):
self.value = base_value
def __add__(self, other: 'ArtifactStats') -> 'ArtifactStats':
"""Сложение характеристик"""
return ArtifactStats(self.value + other.value)
def __mul__(self, multiplier: float) -> 'ArtifactStats':
"""Умножение на коэффициент"""
return ArtifactStats(self.value * multiplier)
def __iadd__(self, other: 'ArtifactStats') -> 'ArtifactStats':
"""Добавление новой характеристики (+=)"""
self.value += other.value
return self
def __bool__(self) -> bool:
"""Проверка наличия значения"""
return self.value > 0
Создайте систему для работы с артефактами Genshin Impact:
Подсказка: Пример структуры классов и их взаимодействия:
# Пример использования системы артефактов
class ArtifactSet:
def __add_artifact(self, artifact: Artifact) -> bool:
# Проверка и добавление артефакта
def get_set_bonus(self) -> dict:
# Расчёт бонусов комплекта
def __len__(self) -> int:
# Количество артефактов в комплекте
# Пример работы с характеристиками
crit_rate = ArtifactStats(31.1)
crit_damage = ArtifactStats(62.2)
total = crit_rate + crit_damage