Слайд 3: Инкапсуляция и магические методы

Теория: Инкапсуляция

Инкапсуляция позволяет скрыть внутреннюю реализацию класса и предоставить контролируемый доступ к данным.

1. Уровни доступа:

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

2. Магические методы:

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)

3. Магические методы для вычислений:

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

Важно помнить:

  • Одно подчёркивание (_) - защищённый член (соглашение)
  • Два подчёркивания (__) - приватный член (изменение имени)
  • @property позволяет работать с методами как со свойствами
  • Магические методы вызываются автоматически в определённых ситуациях
  • NotImplemented возвращается, если операция не определена

Задача: Система артефактов

Создайте систему для работы с артефактами 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