Полезные советы по Python, которых вы ещё не встречали. Часть 2
Недавно мы опубликовали перевод материала, в котором были приведены полезные советы для Python-программистов. У того материала есть продолжение, которое мы представляем вашему вниманию сегодня.
Именование среза с использованием функции slice
Работа с множеством значений, которые заданы индексами, может быстро обернуться беспорядком — как в плане поддержки, так и в плане читабельности кода. Один из вариантов улучшения ситуации заключается в использовании констант для значений, задаваемых индексами. Но есть и более удачный способ написания качественного кода:
В этом примере можно видеть, что, дав срезам имена с помощью функции slice , и использовав эти имена при получении фрагментов строки, мы смогли избавиться от запутанных индексов. Узнать подробности об объекте slice можно с помощью его атрибутов .start , .stop и .step .
Запрос пароля у пользователя во время выполнения программы
Множеству инструментов командной строки или скриптов для работы требуется имя пользователя и пароль. Если вам придётся писать подобную программу — вы, возможно, сочтёте полезным модуль getpass :
Этот очень простой пакет позволяет запрашивать у пользователя его пароль, а также получать имя пользователя, извлекая имя, под которым он вошёл в систему. Правда, при работе с паролями стоит знать о том, что не все системы поддерживают скрытие паролей. Python постарается вас об этом уведомить. Если это произойдёт — вы увидите соответствующее предупреждение в командной строке.
Нахождение близких соответствий в строках
Теперь поговорим о немного более таинственной возможности стандартной библиотеки Python. Предположим, вы попали в ситуацию, когда вам понадобилось, задействуя концепцию наподобие расстояния Левенштейна, найти в списке слова, похожие на некую входную строку. Решить эту задачу можно с помощью модуля difflib .
Метод difflib.get_close_matches ищет наилучшие, «достаточно хорошие» совпадения. Первый аргумент этого метода задаёт искомую строку, второй аргумент задаёт список, в котором выполняется поиск. Этому методу можно передать необязательный аргумент n , который задаёт максимальное число возвращаемых совпадений. Ещё этот метод поддерживает необязательный именованный аргумент cutoff (по умолчанию он установлен в значение 0.6 ), который позволяет задавать пороговое значение для оценки совпадений.
Работа с IP-адресами
Если вам приходится писать на Python программы для работы с сетью — это значит, что вам может очень пригодиться модуль ipaddress . Одним из вариантов его использование является генерирование списка IP-адресов из диапазона адресов, заданных в формате CIDR (Classless Inter-Domain Routing, бесклассовая адресация).
Ещё одна полезная возможность этого модуля — проверка IP-адреса на предмет принадлежности его к некоей сети:
У модуля ipaddress есть и много других интересных возможностей, о которых я тут не рассказываю. Почитать подробности о нём можно здесь. Правда, пользуясь этим модулем, учитывайте ограничения, касающиеся его совместной работы с другими модулями, имеющими отношение к сетевому программированию. Например, нельзя использовать экземпляры IPv4Network в виде строк адреса. Подобные объекты для этого сначала надо конвертировать в строки с помощью str .
Отладка программы в командной строке
Если вы — из тех, кто не хочет пользоваться IDE и пишет код в Vim или Emacs, тогда вы, возможно, попадали в ситуацию, когда вам пригодился бы отладчик, вроде тех, что есть в IDE. И знаете что? У вас такой отладчик уже есть. Для того чтобы им воспользоваться, достаточно запустить программу с помощью конструкции вида python3.8 -i . Флаг -i позволяет, после завершения программы, запустить интерактивную оболочку. С её помощью можно исследовать переменные и вызывать функции. Это интересная возможность, но как насчёт настоящего отладчика (pdb)? Давайте поэкспериментируем со следующей простой программой, код которой находится в файле script.py :
Запустим её командой python3.8 -i script.py и получим следующее:
Мы видим место программы, в котором произошёл сбой. Зададим точку останова:
Снова запустим скрипт.
script.py(3)func()
-> return 0 / 0
(Pdb) # начинаем здесь
(Pdb) step
ZeroDivisionError: division by zero
> script.py(3)func()
-> return 0 / 0
(Pdb)
В большинстве ситуаций для отладки скриптов достаточно команды print и результатов трассировки, но иногда для того, чтобы разобраться со сложным сбоем, нужно покопаться в программе и вникнуть в суть происходящего. В подобных случаях в коде задают точки останова и исследуют программу. Например — смотрят аргументы функций, вычисляют выражения, проверяют значения переменных, или, как показано выше, просто занимаются пошаговым выполнением кода. Pdb представляет собой полнофункциональную Python-оболочку. В этой оболочке можно выполнить практически всё, что угодно. В ходе работы вам пригодятся некоторые специфические команды отладчика, справку по которым можно найти здесь.
Объявление нескольких конструкторов в классе
Перегрузка функций — это одна из возможностей, весьма широко используемых в различных языках программирования, но не в Python. И даже хотя в Python нельзя перегрузить обычную функцию, мы можем пользоваться чем-то вроде перегрузки конструкторов с использованием методов класса:
В подобной ситуации вы, вместо использования методов класса, можете склониться к тому, чтобы поместить всю логику альтернативных конструкторов в __init__ и решить задачу с использованием *args , **kwargs и множества выражений if . В результате может получиться рабочий код, но этот код будет тяжело читать и поддерживать. Тут я порекомендовал бы поместить минимум логики в __init__ и выполнить все операции в отдельных методах/конструкторах. При таком подходе в нашем распоряжении окажется чистый код, с которым удобно будет работать и автору этого кода, и тому, кто этим кодом будет пользоваться.
Кэширование результатов вызова функций с помощью декоратора
Доводилось ли вам писать функции, которые выполняли какие-нибудь длительные операции чтения-записи, или достаточно медленные рекурсивные вычисления? Думали ли вы при этом о том, что таким функциям не повредило бы кэширование результатов? Кэшировать (мемоизировать) результаты вызова функции можно с помощью декоратора lru_cache из модуля functools :
В этом примере мы выполняем GET-запросы, результаты которых кэшируются (кэшировано может быть до 32 результатов). Тут можно увидеть и то, что мы получаем сведения о кэше функции, воспользовавшись методом cache_info . Декоратор, кроме того, даёт в наше распоряжение метод clear_cache , применяемый для инвалидации кэша. Тут мне ещё хотелось бы отметить то, что кэширование нельзя использовать с функциями, у которых есть побочные эффекты, или с функциями, создающими мутабельные объекты при каждом вызове.
Нахождение элементов, которые встречаются в итерируемом объекте чаще всего
Нахождение в списке таких элементов, которые встречаются в нём чаще других, это весьма распространённая задача. Решить её можно, например, воспользовавшись циклом for и словарём, в котором будут собраны сведения о количестве одинаковых элементов. Но такой подход — это пустая трата времени. Дело в том, что решать подобные задачи можно с помощью класса Counter из модуля collections :
Внутренние механизмы класса Counter основаны на словаре, хранящем соответствия элементов и количества их вхождений в список. Поэтому соответствующий объект можно использовать как обычный объект dict :
Кроме того, при работе с Counter в нашем распоряжении оказывается метод update(more_words) , используемый для добавления к счётчику новых элементов. Ещё одна полезная возможность Counter заключается в том, что он позволяет использовать математические операции (сложение и вычитание) при работе с экземплярами этого класса.
Итоги
Думаю, что большая часть из приведённых сегодня советов вполне может использоваться теми, кто пишет на Python, практически ежедневно. Надеюсь, вы нашли среди них что-то такое, что пригодится именно вам.
Уважаемые читатели! Знаете какие-нибудь интересные приёмы Python-программирования? Если так — просим ими поделиться.
Способы достижения нескольких конструкторов в Python
Python предлагает некоторые альтернативные способы поддержки нескольких конструкторов. Некоторые из этих способов мы обсудим здесь на практике.
- Автор записи
Способы достижения нескольких конструкторов в Python
Привет программистам, сегодняшняя статья посвящена нескольким конструкторам в Python. Переход на python с любого другого языка программирования имеет все преимущества, за исключением случаев, когда речь идет о нескольких конструкторах. Python не поддерживает несколько конструкторов. Однако python предлагает некоторые альтернативные способы поддержки нескольких конструкторов. Мы обсудим некоторые из этих способов здесь. Но прежде позвольте мне кратко рассказать вам о том, что такое необходимость в нескольких конструкторах в программе.
Несколько конструкций помогут вам настроить свой класс в соответствии с его параметрами. При использовании разного количества параметров могут срабатывать разные конструкции. В отличие от других языков программирования, Python имеет другой способ обработки нескольких параметров. Мы подробно рассмотрим каждый из них.
Python Несколько Конструкторов И Его Необходимость:
Несколько конструкторов используются, когда определенный класс должен выполнять различные функции. И на разных параметрах или экземплярах класса.
При многократном написании одного и того же метода для класса последний перезаписывает все предыдущие конструкторы. Поскольку несколько конструкторов плохо работают с python, конструкторы классов демонстрируют полиморфизм. Этот метод помогает реплицировать функцию множественного конструктора в python.
Различные способы получить несколько конструкторов в Python:
- Перегрузка конструктора на основе аргументов
- <Методы, вызываемые из __init__
- @classmethod decorator
Перегрузка конструктора Python на основе аргументов в виде нескольких конструкторов:
ОБЪЯСНЕНИЕ:
В приведенном выше примере ответом является переменная экземпляра примера класса. Его значение различалось в разных экземплярах внутри класса на основе аргументов. Класс может иметь несколько аргументов. Поэтому *args определяется как кортеж, содержащий различные переданные ему аргументы. Аргументы доступны с помощью индекса. Например, как и в случае с целыми числами и строками, поскольку передается только один аргумент, доступ к нему осуществляется как к args[0]. В то время как для суммы доступ к более чем одному аргументу, переданному ей, осуществляется с помощью цикла.
Методы Python, вызывающие из __init__ как несколько конструкторов:
ОБЪЯСНЕНИЕ:
В этом примере три уравнения, выполняемые в экземплярах класса: equaton1 –2 + b2 equation2 – + b – c. Уравнение 3 – z = сумма квадрата переданных аргументов/5.0.
уравнение 1 для двух аргументов. уравнение 2 – для трех, а уравнение 3-для более чем трех.
Используя мультиконструктор в python, определяется класс, имеющий один конструктор __init__. Он может выполнять любые действия по созданию различных экземпляров класса. Прежде всего, в приведенном выше коде уравнения, подлежащие вычислению, записываются в разных экземплярах класса. Прежде всего конструктор __init__ вызывает различные методы для возврата ответа на основе количества переданных аргументов.
@classmethod decorator как несколько конструкторов:
ОБЪЯСНЕНИЕ:
Уравнения, выполняемые в приведенном выше примере: equaton1 –2 + b2. Уравнение 2 –+ b – c. Аналогично уравнению 3 – z = сумма квадрата переданных аргументов/5.0.
При передаче двух аргументов вычисляется уравнение 1. Для трех аргументов выполняется уравнение 2. И для более чем трех аргументов вычисляется уравнение 3.
Экземпляры изначально не создаются для вышеуказанного класса. Аналогично, методы классов определяются для оценки различных уравнений с помощью декоратора @classmethod. Поэтому теперь они называются именами классов. Кроме того, мы создаем объекты внутри самих методов класса после оценки href=”https://en.wikipedia.org/wiki/Dynamic_programming”>уравнения. Поэтому переменная экземпляра возвращает ответ. href=”https://en.wikipedia.org/wiki/Dynamic_programming”>уравнения. Поэтому переменная экземпляра возвращает ответ.
Надо Читать
- Введение в Python Super С примерами
- Функция справки Python
- Почему Python sys.exit лучше других функций выхода?
- Python Bitstring: Классы и другие примеры | Модуль
Вывод:
В заключение можно сказать, что сам Python не может поддерживать использование мультиконструкторов для класса. Он допускает различные альтернативы, рассмотренные выше. Однако перегрузка конструктора и __init__ definition влечет за собой определенные проблемы. Во-первых, нет четкого указания на то, что требуется при создании экземпляров класса. Кроме того, существуют различные комбинации инициализации нового экземпляра путем передачи аргументов. Таким образом, лучшая из трех приведенных альтернатив-это декорирование с помощью @classmethod decorators в качестве мультиконструкторов.
Однако, если у вас есть какие-либо сомнения или вопросы, дайте мне знать в разделе комментариев ниже. Я постараюсь помочь вам как можно скорее.
Работа с конструкторами в Python
Конструктор в Python – это особый тип метода (функции), который используется для инициализации членов экземпляра класса.
В C ++ или Java конструктор имеет то же имя, что и его класс, в Python конструктор обрабатывается по-разному. Он используется для создания объекта.
Конструкторы бывают двух типов:
- Параметризованный конструктор
- Непараметрический конструктор
Определение конструктора выполняется, когда мы создаем объект этого класса. Конструкторы также проверяют, что у объекта достаточно ресурсов для выполнения любой задачи запуска.
Создание конструктора на Python
В Python метод __init __() имитирует конструктор класса. Этот метод вызывается при создании экземпляра класса. Он принимает ключевое слово self в качестве первого аргумента, который позволяет получить доступ к атрибутам или методу класса.
Мы можем передать любое количество аргументов во время создания объекта класса, в зависимости от определения __init __(). В основном он используется для инициализации атрибутов класса. У каждого класса должен быть конструктор, даже если он просто полагается на конструктор по умолчанию.
Рассмотрим следующий пример для инициализации атрибутов класса Employee при работе с конструкторами в Python.
Подсчет количества объектов класса
Конструктор вызывается автоматически, когда мы создаем объект класса. Рассмотрим следующий пример.
Непараметрический
Непараметрический конструктор используется, когда мы не хотим манипулировать значением, или конструктором, который имеет только self в качестве аргумента. Разберем на примере.
Параметризованный конструктор Python
У параметризованного конструктора есть несколько параметров вместе с самим собой.
Конструктор Python по умолчанию
Когда мы не включаем конструктор в класс или забываем его объявить, он становится конструктором по умолчанию. Он не выполняет никаких задач, а инициализирует объекты. Рассмотрим пример.
Более одного конструктора в одном классе
Давайте посмотрим на другой сценарий, что произойдет, если мы объявим два одинаковых конструктора в классе.
В приведенном выше коде объект st вызвал второй конструктор, тогда как оба имеют одинаковую конфигурацию. Первый метод недоступен для объекта st. Внутренне объект класса всегда будет вызывать последний конструктор, если у класса есть несколько конструкторов.
Примечание. Перегрузка конструктора в Python запрещена.
Встроенные функции классов Python
Встроенные функции, определенные в классе, описаны в следующей таблице.
| SN | Функция | Описание |
|---|---|---|
| 1 | getattr(obj,name,default) | Используется для доступа к атрибуту объекта. |
| 2 | setattr(obj, name,value) | Она используется для установки определенного значения для определенного атрибута объекта. |
| 3 | delattr (obj, name) | Необходима для удаления определенного атрибута. |
| 4 | hasattr (obj, name) | Возвращает истину, если объект содержит определенный атрибут. |
Встроенные атрибуты класса
Наряду с другими атрибутами класс Python также содержит некоторые встроенные атрибуты класса, которые предоставляют информацию о классе.
Реализация нескольких конструкторов в Python
Часто при разработке программ на Python возникает ситуация, когда необходимо создать несколько конструкторов для одного класса. Это может быть полезно, например, когда у класса есть несколько полей, и нужно предоставить различные способы инициализации этих полей.
Рассмотрим пример. Пусть имеется класс Book , у которого есть свойства title и author . В некоторых случаях вам может потребоваться создать книгу, указав оба этих свойства. В других случаях вы может хотеть создать книгу без автора.
В Python метод __init__ класса выступает в роли конструктора, однако Python не поддерживает несколько методов __init__ в одном классе. В таком случае обычный подход — использовать значения по умолчанию для аргументов конструктора.
В этом примере, если при создании объекта класса Book не указывается автор, то свойство author автоматически получает значение None .
В данном случае, книга book1 будет создана с указанным автором, а книга book2 – без автора.
Это наиболее часто используемый подход для реализации «нескольких конструкторов» в Python. Он прост, чист и «pythonic».