Слайд 1: Основы классов в Python

Теория: Классы в Python

Классы позволяют создавать собственные типы данных, объединяющие свойства (атрибуты) и поведение (методы). В Python всё является объектом и принадлежит какому-либо классу.

Определение класса:

class Character:
    """Базовый класс для игрового персонажа"""
    
    def __init__(self, name: str, element: str, weapon: str):
        # Атрибуты экземпляра
        self.name = name
        self.element = element
        self.weapon = weapon
        self.level = 1
        self.hp = 1000
        self.atk = 100
        
    def __str__(self) -> str:
        """Строковое представление персонажа"""
        return f"{self.name} ({self.element})"

Методы класса:

class Character:
    def level_up(self, levels: int = 1) -> None:
        """Повышение уровня персонажа"""
        self.level += levels
        # Увеличение характеристик при повышении уровня
        self.hp += levels * 100
        self.atk += levels * 10
        
    def is_ready_for_ascension(self) -> bool:
        """Проверка возможности возвышения"""
        return self.level in [20, 40, 50, 60, 70, 80]
        
    @property
    def stats(self) -> dict:
        """Получение всех характеристик персонажа"""
        return {
            "HP": self.hp,
            "ATK": self.atk,
            "Level": self.level
        }

Работа с объектами класса:

# Создание экземпляра класса
venti = Character("Венти", "Анемо", "Лук")

# Использование методов
venti.level_up(20)
print(venti.stats)  # Вывод характеристик

# Изменение атрибутов
venti.atk += 100  # Увеличение базовой атаки

# Проверка готовности к возвышению
if venti.is_ready_for_ascension():
    print(f"{venti.name} готов к возвышению!")

Атрибуты класса:

class Character:
    # Атрибуты класса (общие для всех экземпляров)
    max_level = 90
    valid_elements = ["Пиро", "Гидро", "Анемо", "Электро", 
                     "Дендро", "Крио", "Гео"]
    
    def __init__(self, name: str, element: str, weapon: str):
        if element not in self.valid_elements:
            raise ValueError(f"Недопустимый элемент: {element}")
        self.name = name
        self.element = element
        
    def level_up(self, levels: int = 1) -> None:
        new_level = self.level + levels
        if new_level > self.max_level:
            raise ValueError(f"Максимальный уровень: {self.max_level}")

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

  • Метод __init__ вызывается при создании объекта
  • self ссылается на текущий экземпляр класса
  • Атрибуты класса общие для всех экземпляров
  • Атрибуты экземпляра уникальны для каждого объекта
  • @property позволяет работать с методами как со свойствами

Задача: Создание класса персонажа

Создайте класс, моделирующий персонажа Genshin Impact. Реализуйте:

Подсказка: Пример структуры класса:

class GenshinCharacter:
    valid_elements = [...]
    valid_weapons = [...]
    
    def __init__(self, name: str, element: str, weapon: str):
        # Проверки и инициализация
        
    @property
    def base_damage(self) -> float:
        # Расчет базового урона
        
    def validate_stats(self) -> bool:
        # Проверка корректности характеристик