Класи і модулі. Звертання до класів інших модулів
Зміст
- 1. Звертання до класу з іншого модуля. Спосіб 1
- 2. Звертання до класу з іншого модуля. Спосіб 2
- 3. Випадок, коли клас та модуль мають однакові імена
- 4. Випадок, коли в модулях є класи з однаковими іменами
- 5. Загальноприйняті домовленості до задавання імен модулів та класів
- Зв’язані теми
Пошук на інших ресурсах:
1. Звертання до класу з іншого модуля. Спосіб 1
Клас може бути оголошений в інтерактивній оболонці або в модулі.
Якщо клас оголошений в модулі, то він вважається атрибутом модуля. Це означає, що до імені класу можна звертатись використовуючи таку форму
moduleName.ClassName
тут
- moduleName – ім’я модуля, клас якого потрібно підключити до поточного модуля;
- ClassName – ім’я класу в модулі moduleName.
Щоб цей спосіб працював попередньо потрібно виконати директиву import
import moduleName
Цей спосіб звертання до класу використовується і у випадку успадкування цього класу.
Приклад. На рисунку 1 показано виклик методу Show() класу Hello модуля Module1 з програмного коду модуля Module2.
Рисунок 1. Звертання до класу Hello з іншого модуля
Після запуску програми “Module2.py” буде виведено наступний результат
Module1.Hello.Show
⇑
2. Звертання до класу з іншого модуля. Спосіб 2
При цьому способі, до класу іншого модуля можна звертатись без використання імені модуля перед іменем класу (дивіться попередній спосіб). У цьому випадку потрібно використати поєднання директив from та import за наступним зразком
from moduleName import ClassName
тут
- moduleName – ім’я модуля, в якому оголошується клас ClassName;
- ClassName – ім’я класу, що оголошений в модулі moduleName.
Після такого підключення, можна звертатись до імені ClassName без вказання перед ним імені модуля.
Приклад. На рисунку 2 зображено приклад звертання до класу Triangle без використання імені Module1.
Рисунок 2. Спосіб доступу до імені класу з допомогою комбінації директив from-import
⇑
3. Випадок, коли клас та модуль мають однакові імена
Бувають випадки, коли модуль та клас в ньому мають однакові імена. Тоді, щоб доступитись до імені класу з використанням способу 1 (дивіться п. 1), потрібно перед ним обов’язково вказати ім’я модуля.
Якщо ім’я модуля не вказати, то буде згенеровано виключення. Окреме ім’я сприймається інтерпретатором як ім’я модуля а не ім’я класу. Цей момент пояснює наступний приклад.
Приклад. Задано модуль circle.py в якому реалізовано клас Circle
# Модуль circle.py # Клас, що визначає коло import math class Circle: # Метод початкової ініцалізації def __init__(sl, x, y, r): sl.x = x sl.y = y sl.r = r # Повертає площу круга def Area(sl): return math.pi*sl.r*sl.r
Тоді, щоб використати клас Circle в іншому модулі, потрібно при зверненні до його імені обов’язково вказати ім’я модуля.
# Модуль з іменем module2.py # Підключення модуля circle import circle # Звертання до класу Circle # обов'язково вказати ім'я модуля obj = circle.Circle(2, 3, 5) area = obj.Area() print("area = ", area)
Результат виконання програми
area = 78.53981633974483
Якщо в рядку
obj = circle.Circle(2, 3, 5)
забрати ім’я модуля circle
obj = Circle(2, 3, 5)
то виникне виключна ситуація.
⇑
4. Випадок, коли в модулях є класи з однаковими іменами
Якщо в модулі, що підключається, оголошений клас, ім’я якого співпадає з іменем класу поточного модуля, то в цьому випадку діє правило:
- щоб доступитись до класу іншого модуля обов’язково перед іменем класу потрібно задати ім’я іншого модуля. У цьому випадку, спосіб з використанням директив from-import, не працює. Працює тільки спосіб з використанням директиви import.
Приклад. У прикладі в різних модулях оголошуються класи з однаковими іменами. Для такого випадку демонструється правильний спосіб використання класу іншого модуля.
Текст модуля module1.py.
# Модуль з іменем module1.py # У модулі оголошується клас з іменем A class A: # Деякий метод класу def A(self): print("Module1: A.A()")
Текст модуля module2.py. У цьому модулі показано, як доступитись до класу A модуля module1.py.
# Модуль module2.py # Підключення модуля module1.py. # Тільки так, комбінація директив from-import не працює import module1 # У цьому модулі є свій клас з іменем A class A: def A(self): print("Module2: A.A()") # 1. Звертання до класу A obj = A() # який клас буде вибрано??? # Вибирається клас поточного модуля obj.A() # Module2: A.A() # 2. Якщо потрібно звернутись до класу A # модуля module1, то тільки так obj2 = module1.A() obj2.A()
Якщо замість рядка
import module1
написати
from module1 import A
то у рядку
obj2 = module1.A()
буде видавати помилку
NameError: name 'module1' is not defined
Після запуску програма видасть наступний результат
Module2: A.A() Module1: A.A()
⇑
5. Загальноприйняті домовленості до задавання імен модулів та класів
При написанні великих проектів, що містять велику кількість модулів та класів, важливим є правильна ідентифікація. Тому, у мові Python щодо імен класів та модулів прийняті узгоджені домовленості:
- імена модулів прийнято починати з малих літер
- імена класів прийнято починати з великих літер.
Це необхідно для забезпечення кращої візуальної відмінності.
Наприклад. У модулі graphics реалізовано клас DrawLine. Тоді звертання до імені класу з використанням імені модуля буде таким
import graphics
...
graphics.DrawLine
⇑
Зв’язані теми
- Класи в Python. Загальні поняття. Ключове слово class. Об’єкти класів. Об’єкти екземплярів
- Спадковість у класах. Правила застосування спадковості. Приклади
⇑