Модулі

Вступ

У попередньому уроці ми з вами освоїли дуже важливий урок – Класи в мові Python. Як ми пам’ятаємо, клас є таким собі об’єднанням змінних та функцій під одним дахом. Програмістський словник називає дану властивість класів (об’єднання усіх змінних та функцій разом) інкапсуляцією. В будь-якому випадку це дуже зручно тримати усі наші функції та змінні в одному місці таким чином, щоб потім перевикористовувати даний код у багатьох інстансах і місцях в коді.

І напевне у вас на даний момент виникає питання: “як я можу використовувати мої класи у різних місцях, у різних програмах?”. Відповідь полягає у тому, щоб покласти наш клас в МОДУЛЬ, так щоб ми могли пізніше імпортнути його з іншого місця в інших наших програмах.

Що таке модуль?

Модуль – це пітонівський файл (файл з кодом на мові Python), який має лише визначення класів, функцій та змінних. Наприклад, модуль може мати наступний вигляд:

Як ви можете бачити, модуль виглядає в принципі так само як звичайна програма на мові Пітон.

То ж що ми робимо з модулем? Ми імпортуємо (‘import’) частинки з нього, або все що у ньому є, в інші програми, і використовуємо його змінні, функції та класи.

Щоб імпортнути змінні, функції та класи наприклад з модуля ‘moduletest.py’ в іншу програму, яку ми створюємо, ми використовуємо оператор ‘import’. Наприклад, щоб імпортнути сам модуль ‘moduletest.py’, у нашу головну програму, ми використаємо оператор ‘import’ наступним чином:

Вище наведений приклад працюватиме у випадку, якщо модуль ‘moduletest.py’ лежить у ті й же ж папочці, де ми маємо нашу основну програму (назвемо її ‘mainprogram.py’), або також, якщо цей модуль є дефолтним, вбудованим у саму мову Пітон. Зауважте, ми не вказуємо розширення файшлу ‘.py’, при використанні оператора ‘import’. Зазвичай ми розташовуємо усі необхідні імпорти на початку нашої програми, але технічно вони можуть бути у будь-якому місці програми. Для того, щоб використовувати речі з імпортованого модуля, ми робимо наступні речі:

Як ви бачите, модулі, які ми з вами імпортували, працюють подібним чином до пітонівських класів – все, що знаходиться всередині модуля, ми можемо дістати через назву модуля (наперед імпортованого) плюc символ крапки. Тобто ‘modulename.’ дозволить доступитися до внутрішніх змінних та функції даного модуля.

І ще кілька фішок по модулях

Бажаєте позбутися використання усюди префіксу ‘modulename.’ ? Без проблем. Один із варіантів уникати його – імпортувати необхідні змінні, функції чи класи з модуля напряму, по імені даної змінної чи функції. Щоб зробити це, потрібно також скористатися додатковим оператором ‘from’ поєднуючи з уже відомим нам оператором ‘import’.

Уявимо, що модуль ‘moduletest’ має змінну ‘years’ та функцію ‘hello_world’. От як виглядатиме їхній імпорт з даного модуля:

Таким чином ви можете зробити ваш код більш зрозумілим і читабельним, імпортуючи речі з модуля напряму, і лише ті, які вам необхідні у вашій поточній програмі. Також, у такий спосіб, інший програміст зможе з легкістю зрозуміти, які зовнішні змінні та функції використовуються у даній програмі, і звідки вони беруться.

Якщо б ви хотіли, ви також можете імпортнути усе з модуля, одним махом. Це можна зробити використовуючи спеціальний запис – зірочку ‘*’. Звичайно, це може мати негативні ефекти у окремих випадках. Наприклад, якщо ви у своїй головній програмі імпортуєте УСЕ з більш ніж одного модуля, і у цих модулях є змінні чи функції з однаковими назвами. У таких випадках імпортування використовуючи запис зірочки – не підходить. Також з великими модулями краще не бавитися зірочкою, а імпортувати лише необхідні речі, напряму вказуючи їхні імена у рядку імпорту.

Ще одна фішка. У випадку, якщо вам треба скористатися змінними чи функціями з різних модулів, і дані змінні чи функції мають однакові назви, тоді ви можете використати оператор ‘as’ у поєднанні з ‘from’ та ‘import’ для того, щоб призначити даним проблематичним (дублікатам) назвам інше локальне (локальне для даної головної програми) ім’я. Наприклад, уявимо, що в модулі module1 є функція hello_world, і в модулі module2 є визначена функція із такою ж назвою. Ось як ми можемо цю проблему ‘розрулити’ під час імпорту:

Ще є можливість, починаючи з Пітона версії 2.5, імпортувати з пакетів і модулів використовуючи так звані відносні шляхи. Але це вже більш розширена тема, і в даному уроці її розглядати не будемо.

Ніби усе по фішках.

На завершення

Так, це був досить простий і коротенький, але тим не менше досить важливий урок. Адже в більшості випадків ви перевикористовуватиме код (функції, змінні, класи) уже написані у самому Пітоні, або додаткових бібліотеках, або навіть вами самими. І щоб ними скористатися, треба знати як правильно цей код імпортувати у вашу програму. Як то кажуть, швидший не той, хто вміє швидко писати код, а той, хто вміє вдало скористатися уже існуючими бібліотеками та функціоналом для вирішення своєї задачі 😉

Вітаю з проходженням чергового, уже 9-го уроку! Так тримати!

Якщо з’явилися питання, чи знайшли неточності – дуже прошу коментувати. Буде вирішувати проблеми і виправляти помилки.

У наступному уроці ми з вами спробуємо розібратися у файлах вводу та виводу. Буде цікаво!