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

 


Зв’язані теми