__init__.py

Слайд 2B: Инициализационные файлы (__init__.py)

Что такое __init__.py?

__init__.py - это специальный файл, который определяет директорию как пакет Python. Он выполняется при импорте пакета.

Когда выполняется __init__.py:

  • При первом импорте пакета или подпакета
  • Выполняется только один раз (при последующих импортах используется кэшированная версия)
  • Выполняется до импорта любых модулей из пакета

1. Пустой __init__.py:

# Пустой файл - просто отмечает директорию как пакет Python
# Самый простой случай использования

2. Настройка импортов:

# genshin_tools/characters/__init__.py

# Импорты для удобства использования
from .base import Character
from .talents import TalentSystem

# Что доступно при импорте через *
__all__ = ['Character', 'TalentSystem']

# Теперь можно использовать так:
# from genshin_tools.characters import Character
# Вместо:
# from genshin_tools.characters.base import Character

3. Инициализация пакета:

# genshin_tools/__init__.py

"""
GenshinTools - пакет для расчётов в Genshin Impact
"""

# Метаданные пакета
__version__ = "0.1.0"
__author__ = "Your Name"

# Инициализация важных переменных
DEFAULT_CRIT_RATE = 5.0
DEFAULT_CRIT_DMG = 50.0

# Загрузка конфигурации при импорте
import json
from pathlib import Path

config_path = Path(__file__).parent / "config.json"
if config_path.exists():
    with open(config_path) as f:
        CONFIG = json.load(f)
else:
    CONFIG = {"default_language": "ru"}

4. Объединение функциональности:

# genshin_tools/combat/__init__.py

# Собираем все функции расчёта урона в одном месте
from .normal import calculate_normal_attack
from .charged import calculate_charged_attack
from .plunge import calculate_plunge_attack

def calculate_all_damage(base_atk, talent_levels):
    """Рассчитывает все типы урона"""
    return {
        "normal": calculate_normal_attack(base_atk, talent_levels["normal"]),
        "charged": calculate_charged_attack(base_atk, talent_levels["charged"]),
        "plunge": calculate_plunge_attack(base_atk, talent_levels["plunge"])
    }

# Экспортируем только нужные функции
__all__ = ['calculate_all_damage']

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

  • __init__.py нужен в каждой директории пакета
  • Не перегружайте __init__.py сложной логикой
  • Используйте относительные импорты внутри пакета (.module)
  • __all__ определяет публичный API пакета
  • Инициализация в __init__.py выполняется при импорте

Задача: Организация пакета для артефактов

Создайте систему __init__.py файлов для пакета работы с артефактами:

Подсказка: Пример организации импортов:

# artifacts/__init__.py
from .sets import GladiatorSet, NoblesseSet
from .stats import calculate_stats

__all__ = ['GladiatorSet', 'NoblesseSet', 'calculate_stats']

# artifacts/sets/__init__.py
from .noblesse import NoblesseSet
from .gladiator import GladiatorSet

__all__ = ['NoblesseSet', 'GladiatorSet']