Необычный Python в обычных библиотеках |
||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2022-08-22 15:00 Вызов super() в базовых классах Функция Одно из интересных применений class BaseAdapter: """The Base Transport Adapter""" def __init__(self): super().__init__() def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): Базовый класс ни от чего не наследуется, так зачем же вызывать в нём Немного покопавшись, я узнал вот что: в базовом классе ключевое слово Итак, у нас class BaseEstimator: def __init__(self, name, **kwargs): self.name = name def __repr__(self): return f', '.join(f'{k}: {v}' for k, v in vars(self).items()) Затем мы наследуем class DecisionTree(BaseEstimator): def __init__(self, depth, **kwargs): super().__init__(**kwargs) self.depth = depth dt = DecisionTree(name='DT', depth=1) print(dt) > name: DT, depth: 1 Теперь пронаследуемся от class ServingMixin: def __init__(self, mode, **kwargs): super().__init__(**kwargs) self.mode = mode class DecisionTree(BaseEstimator, ServingMixin): def __init__(self, depth, **kwargs): super().__init__(**kwargs) self.depth = depth dt = DecisionTree(name='Request Time DT', depth=1, mode='online') print(dt) > name: Request Time DT, depth: 1 dt.mode > AttributeError: 'DecisionTree' object has no attribute 'mode' Заметно, что Это связано с тем, что без Исправить это можно вызовом class BaseEstimator: def __init__(self, name, **kwargs): self.name = name super().__init__(**kwargs) def __repr__(self): return f', '.join(f'{k}: {v}' for k, v in vars(self).items()) class ServingMixin: def __init__(self, mode, **kwargs): super().__init__(**kwargs) self.mode = mode class DecisionTree(BaseEstimator, ServingMixin): def __init__(self, depth, **kwargs): super().__init__(**kwargs) self.depth = depth dt = DecisionTree(name='Request Time DT', depth=1, mode='online') print(dt) > name: Request Time DT, mode: online, depth: 1 dt.mode > 'online' Именно поэтому мы можем захотеть вызвать Когда использовать миксины?
Когда использовать миксины? Они подходят, когда хочется:
Ниже — пример первого случая. Начнём с создания базового объекта запроса в from werkzeug import BaseRequest class Request(BaseRequest): pass Если нужно добавить поддержку заголовка from werkzeug import BaseRequest, AcceptMixin class Request(AcceptMixin, BaseRequest): pass Нужна поддержка пользовательского агента, аутентификации и т. д.? Нет проблем, просто добавьте миксины: from werkzeug import BaseRequest, AcceptMixin, UserAgentMixin, AuthenticationMixin class Request(AcceptMixin, UserAgentMixin, AuthenticationMixin, BaseRequest): pass Благодаря модуляризации этих функций в виде миксинов (а не добавления в класс) базовый класс не раздувается функциями, которые могут использовать только несколько подклассов. Кроме того, эти миксины теперь могут повторно использоваться другими дочерними классами, которые могут не наследоваться от Использование относительного импорта Относительный импорт гарантирует, что мы ищем текущий пакет (и импортируем из него) перед поиском в остальной части from .utils.validation import check_X_y from .utils.validation import check_array Что произойдёт, если Есть ли другая причина не использовать относительный импорт? Пожалуйста, оставьте комментарий ниже. Когда добавлять код в __init__.py
Во-первых, мы можем добавить в from .tree import DecisionTree, RandomForest from .bandit import Bandit, TSBandit Это гарантирует, что существующие пользователи смогут продолжить импорт через Это подводит к ещё одной причине добавить код в app __init__.py model_implementation.py data_implementation.py Вместо того чтобы заставлять пользователей решать, что импортировать из from .model_implementation import SimpleModel from .data_implementation import SimpleDataLoader В нём говорится, что Так делается в Pandas, где Помимо упомянутого выше применения, мы также можем захотеть:
Когда использовать экземпляр, класс и статические методы Краткий обзор методов, которые можно реализовать для класса. Такие методы пригодятся, когда:
Когда использовать класс или статические методы? Ниже — несколько основных рекомендаций, которые я нашёл. Методы класса используются, когда хочется вызвать его, но не создавать его экземпляр. Обычно это происходит, когда не нужна информация об экземпляре, но нужна информация о классе (т. е. о другом его классе или статических методах). Методы класса можно использовать как конструктор. Преимущество методов класса заключается в том, что класс не нужно хардкодить, также они позволяют подклассам работать с методами. Статические методы используются, когда нам не нужны аргументы класса или экземпляра, но некий метод связан с классом и удобно, чтобы этот метод находился в пространстве имён класса. Это могут быть специфичные для класса служебные методы. Оформляя метод как статический, мы улучшаем читаемость и понимание кода, сообщаем, что метод не зависит от класса или экземпляра. Скрытая функция conftest.py Обычно Но, просматривая sklearn, я наткнулся на # Даже если этот файл пустой, он полезен тем, что при запуске из корневой папки # ./sklearn добавляется в sys.path с помощью pytest. Смотрите # https://docs.pytest.org/en/latest/explanation/pythonpath.html. # Например, это позволяет создавать расширения на месте и запускать pytest # doc/modules/clustering.rst, а также использовать sklearn из локальной папки, а не только из site-packages. Оказывается, sklearn использовал менее известную функцию Поясняющая документация библиотек Помимо чтения кода, мы можем учиться, читая документы, объясняющие библиотеку. Давайте сосредоточимся на принципах проектирования библиотек. Принципы проектирования Scikit-learn включают:
В результате большинство моделей машинного обучения и преобразователей данных имеют метод Другой пример — fastai, где используется многоуровневый подход. Фреймворк предоставляет высокоуровневый API, готовые к использованию функции обучения моделей для различных приложений. Высокоуровневый API построен на основе иерархии низкоуровневых API, последние предоставляют компонуемые стандартные блоки. Этот многоуровневый подход позволяет через настройку API-интерфейсов среднего уровня быстро создать прототип перед его кастомизацией. Поделился принципами проектирования и PyTorch. Это:
Первый принцип утверждает: чтобы быть полезной, библиотека должна обеспечивать убедительную производительность, но не за счёт простоты использования. Таким образом, ради значительно более простой в использовании библиотеки PyTorch готов пожертвовать 10, но не 100% скорости. Последний принцип говорит о том, что лучше иметь простое, но немного неполное решение, чем комплексный, но сложный в обслуживании дизайн. • • • Вот некоторые необычные способы работы с Python, о которых я узнал, читая эти билиотеки:
Я уверен, что пока смотрю поверхностно. Может быть, я что-нибудь упустил? Пожалуйста, оставьте комментарий ниже! Источник: m.vk.com Комментарии: |
|