Модулі
Вступ
У попередньому уроці ми з вами освоїли дуже важливий урок – Класи в мові Python. Як ми пам’ятаємо, клас є таким собі об’єднанням змінних та функцій під одним дахом. Програмістський словник називає дану властивість класів (об’єднання усіх змінних та функцій разом) інкапсуляцією. В будь-якому випадку це дуже зручно тримати усі наші функції та змінні в одному місці таким чином, щоб потім перевикористовувати даний код у багатьох інстансах і місцях в коді.
І напевне у вас на даний момент виникає питання: “як я можу використовувати мої класи у різних місцях, у різних програмах?”. Відповідь полягає у тому, щоб покласти наш клас в МОДУЛЬ, так щоб ми могли пізніше імпортнути його з іншого місця в інших наших програмах.
Що таке модуль?
Модуль – це пітонівський файл (файл з кодом на мові Python), який має лише визначення класів, функцій та змінних. Наприклад, модуль може мати наступний вигляд:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
### приклад пітонівського модуля # визначаємо деякі змінні years = 8 apples = 23 # визначаємо деякі функції def hello_world(): print "hi there" def multiply(value): print value * 4 # визначаємо клас Стола (Table) class Table: def __init__(self): self.color = raw_input(u"Який колір стола? ") self.height = raw_input(u"Яка висота стола? ") self.price = raw_input(u"Яка ціна стола? ") def details(self): """Друкуємо деталі про даний стіл""" print u"Цей стіл має висоту " + self.height + " метрів" print u"Цей стіл коштує " + self.price + " гривень" |
Як ви можете бачити, модуль виглядає в принципі так само як звичайна програма на мові Пітон.
То ж що ми робимо з модулем? Ми імпортуємо (‘import’) частинки з нього, або все що у ньому є, в інші програми, і використовуємо його змінні, функції та класи.
Щоб імпортнути змінні, функції та класи наприклад з модуля ‘moduletest.py’ в іншу програму, яку ми створюємо, ми використовуємо оператор ‘import’. Наприклад, щоб імпортнути сам модуль ‘moduletest.py’, у нашу головну програму, ми використаємо оператор ‘import’ наступним чином:
1 2 3 |
# це головна програма наша - mainprogam.py # імпортуємо інший модуль, під назвою moduletest import moduletest |
Вище наведений приклад працюватиме у випадку, якщо модуль ‘moduletest.py’ лежить у ті й же ж папочці, де ми маємо нашу основну програму (назвемо її ‘mainprogram.py’), або також, якщо цей модуль є дефолтним, вбудованим у саму мову Пітон. Зауважте, ми не вказуємо розширення файшлу ‘.py’, при використанні оператора ‘import’. Зазвичай ми розташовуємо усі необхідні імпорти на початку нашої програми, але технічно вони можуть бути у будь-якому місці програми. Для того, щоб використовувати речі з імпортованого модуля, ми робимо наступні речі:
1 2 3 4 5 6 7 |
# використання імпортованих змінних, функцій та класів; # для цього використовуємо форму <назва імпортованого модуля>.<назва змінної> # Приклади: print moduletest.years stil = moduletest.Table() stil.details() |
Як ви бачите, модулі, які ми з вами імпортували, працюють подібним чином до пітонівських класів – все, що знаходиться всередині модуля, ми можемо дістати через назву модуля (наперед імпортованого) плюc символ крапки. Тобто ‘modulename.’ дозволить доступитися до внутрішніх змінних та функції даного модуля.
І ще кілька фішок по модулях
Бажаєте позбутися використання усюди префіксу ‘modulename.’ ? Без проблем. Один із варіантів уникати його – імпортувати необхідні змінні, функції чи класи з модуля напряму, по імені даної змінної чи функції. Щоб зробити це, потрібно також скористатися додатковим оператором ‘from’ поєднуючи з уже відомим нам оператором ‘import’.
Уявимо, що модуль ‘moduletest’ має змінну ‘years’ та функцію ‘hello_world’. От як виглядатиме їхній імпорт з даного модуля:
1 2 3 4 5 |
from moduletest import hello_world from moduletest import years # або також ми можемо імпортнути кілька імен одним рядочком, через кому from moduletest import hello_world, years |
Таким чином ви можете зробити ваш код більш зрозумілим і читабельним, імпортуючи речі з модуля напряму, і лише ті, які вам необхідні у вашій поточній програмі. Також, у такий спосіб, інший програміст зможе з легкістю зрозуміти, які зовнішні змінні та функції використовуються у даній програмі, і звідки вони беруться.
Якщо б ви хотіли, ви також можете імпортнути усе з модуля, одним махом. Це можна зробити використовуючи спеціальний запис – зірочку ‘*’. Звичайно, це може мати негативні ефекти у окремих випадках. Наприклад, якщо ви у своїй головній програмі імпортуєте УСЕ з більш ніж одного модуля, і у цих модулях є змінні чи функції з однаковими назвами. У таких випадках імпортування використовуючи запис зірочки – не підходить. Також з великими модулями краще не бавитися зірочкою, а імпортувати лише необхідні речі, напряму вказуючи їхні імена у рядку імпорту.
1 2 3 4 5 6 |
# імпортуємо усе з модуля moduletest from moduletest import * # після цього маємо в полі імен нашого поточного файлика усі # змінні, функції та класи з вище імпортованого модуля print hello_world() |
Ще одна фішка. У випадку, якщо вам треба скористатися змінними чи функціями з різних модулів, і дані змінні чи функції мають однакові назви, тоді ви можете використати оператор ‘as’ у поєднанні з ‘from’ та ‘import’ для того, щоб призначити даним проблематичним (дублікатам) назвам інше локальне (локальне для даної головної програми) ім’я. Наприклад, уявимо, що в модулі module1 є функція hello_world, і в модулі module2 є визначена функція із такою ж назвою. Ось як ми можемо цю проблему ‘розрулити’ під час імпорту:
1 2 3 4 5 6 7 8 9 10 11 |
# імпортуємо функцію hello_world з модуля module1 # і присвоюємо їй локальну назву hello_world_1 from module1 import hello_world as hello_world_1 # а тепер функцію hello_world з модуля module2 from mobule2 import hello_world as hello_world_2 # таким чином в просторі локальних імен маємо два нових імені # hello_world_1 та hello_world_2, але не hello_world print hello_world_1() print hello_world_2() |
Ще є можливість, починаючи з Пітона версії 2.5, імпортувати з пакетів і модулів використовуючи так звані відносні шляхи. Але це вже більш розширена тема, і в даному уроці її розглядати не будемо.
Ніби усе по фішках.
На завершення
Так, це був досить простий і коротенький, але тим не менше досить важливий урок. Адже в більшості випадків ви перевикористовуватиме код (функції, змінні, класи) уже написані у самому Пітоні, або додаткових бібліотеках, або навіть вами самими. І щоб ними скористатися, треба знати як правильно цей код імпортувати у вашу програму. Як то кажуть, швидший не той, хто вміє швидко писати код, а той, хто вміє вдало скористатися уже існуючими бібліотеками та функціоналом для вирішення своєї задачі 😉
Вітаю з проходженням чергового, уже 9-го уроку! Так тримати!
Якщо з’явилися питання, чи знайшли неточності – дуже прошу коментувати. Буде вирішувати проблеми і виправляти помилки.
У наступному уроці ми з вами спробуємо розібратися у файлах вводу та виводу. Буде цікаво!
В розділі “Що таке модуль?”, проганяючи файл mainprogram.py після введення даних (висоти та ціни стола) у мене виникає помилка:Traceback (most recent call last):
File “D:\ANDRІY\Навчання\PYTHON (training course)\Імпортування модулів\mainprogramm.py”, line 12, in
stil.details()
File “D:\ANDRІY\Навчання\PYTHON (training course)\Імпортування модулів\moduletest.py”, line 25, in details
print u”Цей стіл має висоту ” + self.height + ” метрів”
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xec in position 1: ordinal not in range(128)
Поясніть чому, будь-ласка.
у модулі забери u всюди, де є таке: u”тексттекст”
Орфографія:
“освоїли дуже ваЖливий урок – Класи”
поправив
Назаре, дуже дякую за рев’ю і знайдені помилки. Усі без виключення зауваження підтверджені і виправлені 🙂