В предыдущем видео вы познакомились с таким языком как Yaml. Давайте, попробуем применить полученные знания на практике и узнать, каким образом можно сконфигурировать вашу программу при помощи конфигурации Yaml. Конфигурировать мы будем абстрактную фабрику, которую мы писали в предыдущем уроке. Для начала импортируем модуль Yaml, Import Yaml и опишем нашу конфигурацию. Назовем ее Hero_yaml. И это будет текстовой документ, текст многострочный. Мы будем описывать персонажа, Character. У персонажа мы будем описывать, какой фабрикой его нужно создавать, какого класса будет наш персонаж и его имя. Первое это Factory, который показывает, каким классом будет наш персонаж. У него будет метка "Factory". И пусть это будет убийца. И зададим нашим персонажу имя. Отлично. Конфигурацию мы создали. Теперь, давайте, попробуем изменить наш код, таким образом, чтобы он мог работать с Yaml-файлами. Выполним код с предыдущего урока и начнем описывать. Для начала нам нужно создать, собственно, конструктор, который может конструировать нашу фабрику. Мы ее описываем в виде какого-то текста, а хотим получить объект фабрика. Давайте напишем def factory_constructor, который будет принимать на вход загрузчик и ноду Yaml-файла. Загрузчик позволяет выгрузить из нашего файлаYaml-файла какие-то данные. Нода это, собственно, та ячейка, которую мы будем обрабатывать. В переменную Data сохраним данные содержащиеся в нашей ячейке. Для этого воспользуемся методом нашего загрузчика, loader.construct_sclar. Вот наши ноды. Почему sclar? Потому что у нас в нашей ноде хранится одно единственное значение, это строка. Там могло храниться несколько значений, например, там массив или какой-то словарь, могло храниться еще что-то, могли храниться какие-то объекты других классов, но, в данном случае, у нас одно единственное значение, одно единственное значение это sclar. Теперь в переменной data у нас хранится информация. Давайте, в зависимости от того, что хранится в нашей переменной, вернем необходимый нам объект. Если там написано, что наш класс, наш персонаж является assasin-ом, то мы вернем фабрику, которая может создавать assasin-ов. Если у нас персонаж маг, то мы вернем также соответствующую ему фабрику, returnMageFactory. Мы считаем, что наш Yaml написан корректно и, если персонаж не является ни assasin-ом, ни магом, то он гарантированно является воином. Конечно, в больших программах такие допущения делать немножечко некорректно. Давайте, изменим наше создание персонажа, таким образом, чтобы оно могло работать с Yaml-файла-файла. Для этого создадим класс "Character", который будет наследоваться от Yaml. Это будет класс, который может обрабатывать наши файлы. Сразу определим тэг. Yaml-tag равно character. Теперь, если мы будем видеть соответствующий тэг, то мы будем создавать объект именно вот этого класса. В данном случае функция "Create hero" у нас будет являться методом класса, поэтому в качестве входного параметра у нее будет значится self. Factory является атрибутом класса. Мы указываем название этого атрибута и создаем, его поэтому обращаться мы к нему будем через "Self". Имя у нас будет тоже задана нашей Yaml-конфигурацией. Давайте-конфигурацией. Давайте, попробуем загрузить наш Yaml-файл и создать героя при помощи нашей конфигурации. Для начала обратимся к загрузчику, Loader равно Yaml.Loader. Нашему загрузчику Loader-у мы добавим новый конструктор. Loader.add _constructor, Factory_constructor. Это будет конструктор, который может создавать наши фабрики. Создавать фабрики он будет из данных с тэгом Factory. Создадим нашего героя Hero. Для этого загрузим данные из нашего Yaml-файла-файла, наш Yaml-файл, Yaml-данные называется HeroYaml. И у полученного объекта Character вызовем метод "Create_hero". Данные загрузились. Давайте, посмотрим, что же у нас произошло, что же загрузилось. Hero.hit и Hero.cast. Мы видим, что у нас класс "Аassasin", имя передавалось верно и он атакует нашим кинжалом и может кастовать невидимость. Итак, вы научились конфигурировать свои программы, свои абстрактные фабрики при помощи Yaml-файлов. В данном примере у нас был очень простой Yaml-файл, который состоял всего из одной фабрики и одного имени. Но вы в своих проектах можете использовать сложные Yaml-конфигурации, которые могут создавать очень продвинутые структуры объектов.