Как импортировать класс в том же каталоге или подкаталоге?


у меня есть каталог, в котором хранятся все .py файлы.

bin/
   main.py
   user.py # where class User resides
   dir.py # where class Dir resides

Я хочу использовать классы из user.py и dir.py in main.py.
Как я могу импортировать эти классы Python вmain.py?
Кроме того, как я могу импортировать класс User если user.py находится в подкаталоге?

bin/
    dir.py
    main.py
    usr/
        user.py
7 413

7 ответов:

Python 2

сделать пустой файл под названием __init__.py в том же каталоге, что и файлы. Это будет означать для Python, что"нормально импортировать из этого каталога".

тогда просто сделайте...

from user import User
from dir import Dir

то же самое верно, если файлы находятся в подкаталоге - put an __init__.py в подкаталоге, а затем использовать регулярные операторы импорта, с точечной нотацией. Для каждого уровня каталога необходимо добавить путь импорта.

bin/
    main.py
    classes/
        user.py
        dir.py

так что если каталог был назван "классы", то вы бы сделали это:

from classes.user import User
from classes.dir import Dir

Python 3

то же, что и предыдущий, но префикс имя модуля с . если не использовать подкаталог:

from .user import User
from .dir import Dir

Я только что узнал (спасибо Мартино комментарий) что, для того чтобы импортировать классы из файлов в том же каталоге, вы бы теперь писать в Python 3:

from .user import User
from .dir import Dir

в своем main.py:

from user import Class

здесь Class - это имя класса, который вы хотите импортировать.

если вы хотите вызвать метод Class, вы можете назвать его с помощью:

Class.method

обратите внимание, что должен быть пустой __init__.py файл в том же каталоге.

вы можете импортировать модуль и иметь доступ через его имя, если вы не хотите смешивать функции и классы с вашим

import util # imports util.py

util.clean()
util.setup(4)

или можно импортировать функции и классы в коде

from util import clean, setup
clean()
setup(4)

вы можете использовать wildchar * для импорта всего в этом модуле в ваш код

from util import *
clean()
setup(4)

чтобы было проще понять:

Шаг 1: давайте перейдем в один каталог, где все будут включены

$ cd /var/tmp

Шаг 2: Теперь давайте сделаем class1.py файл, который имеет имя класса Class1 с некоторым кодом

$ cat > class1.py <<\EOF
class Class1:
    OKBLUE = '3[94m'
    ENDC = '3[0m'
    OK = OKBLUE + "[Class1 OK]: " + ENDC
EOF

Шаг 3: Теперь давайте сделаем class2.py файл, который имеет имя класса Class2 с некоторым кодом

$ cat > class2.py <<\EOF
class Class2:
    OKBLUE = '3[94m'
    ENDC = '3[0m'
    OK = OKBLUE + "[Class2 OK]: " + ENDC
EOF

Шаг 4: Теперь давайте сделаем один main.py который будет выполняться один раз, чтобы использовать Class1 и Class2 из 2 разных файлы

$ cat > main.py <<\EOF
"""this is how we are actually calling class1.py and  from that file loading Class1"""
from class1 import Class1 
"""this is how we are actually calling class2.py and  from that file loading Class2"""
from class2 import Class2

print Class1.OK
print Class2.OK
EOF

Шаг 5: запустите программу

$ python main.py

выход будет

[Class1 OK]: 
[Class2 OK]:
from user import User 
from dir import Dir 

слишком кратко, Создайте файл __init__.py это каталог классов, а затем импортировать его в скрипт, как следующие

from classes.myscript import *