Python. Классы и модули. Обращение к классам других модулей




Классы и модули. Обращение к классам других модулей


Содержание


Поиск на других ресурсах:

 1. Обращение к классу из другого модуля. Способ 1

Класс может быть объявлен в интерактивной оболочке или в модуле.

Если класс объявлен в модуле, то он считается атрибутом модуля. Это означает, что к имени класса можно обращаться используя следующую форму

moduleName.ClassName

здесь

  • moduleName – имя модуля, класс которого нужно подключить к текущему модулю;
  • ClassName – имя класса в модуле moduleName.

Чтобы этот способ работал предварительно нужно выполнить директиву import

import moduleName

Этот способ обращения к классу используется и в случае наследования этого класса.

Пример. На рисунке 1 показан вызов метода Show() класса Hello модуля Module1 из программного кода модуля Module2.

Python. Обращение к класу из другого модуля

Рисунок 1. Обращение к класу Hello из другого модуля

После запуска программы «Module2.py» будет выведен следующий результат

Module1.Hello.Show

 

2. Обращение к классу из другого модуля. Способ 2

При этом способе, к классу другого модуля можно обращаться без использования имени модуля перед именем класса (смотрите предыдущий способ). В этом случае нужно использовать сочетание директив from и import по следующему образцу

from moduleName import ClassName

здесь

  • moduleName — имя модуля, в котором объявляется класс ClassName;
  • ClassName — имя класса, который объявлен в модуле moduleName.

После такого подключения, можно обращаться к имени ClassName без указания перед ним имени модуля.

Пример. На рисунке 2 изображен пример обращения к классу Triangle без использования имени Module1.

Python. Способ доступа к имени класса с помощью комбинации директив from-import

Рисунок 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

 


Связанные темы