Классы и модули. Обращение к классам других модулей
Содержание
- 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. Объекты классов. Объекты экземпляров
- Наследование в классах. Правила применения наследования. Примеры
⇑