Как импортировать класс в том же каталоге или подкаталоге? - PullRequest
518 голосов
/ 10 ноября 2010

У меня есть каталог, в котором хранятся все файлы .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

Ответы [ 8 ]

742 голосов
/ 10 ноября 2010

Python 2

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

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

from user import User
from dir import Dir

То же самое верно, если файлы находятся в подкаталоге - также поместите __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
114 голосов
/ 08 февраля 2015

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

from .user import User
from .dir import Dir
34 голосов
/ 10 ноября 2010

В вашем main.py:

from user import Class

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

Если вы хотите вызвать метод ClassВы можете вызвать его, используя:

Class.method

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

10 голосов
/ 21 июля 2014

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

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)
8 голосов
/ 21 сентября 2013

Чтобы сделать его более простым для понимания:

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

$ cd /var/tmp

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

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

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

$ cat > class2.py <<\EOF
class Class2:
    OKBLUE = '\033[94m'
    ENDC = '\033[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: Запустить программу

[Class1 OK]: 
[Class2 OK]:
4 голосов
/ 15 ноября 2018

Python 3


То же directory.

файл импорта: log.py

класс импорта: SampleApp().

import log
if __name__ == "__main__":
    app = log.SampleApp()
    app.mainloop()

или

каталог: basic.

импорт в файл: log.py.

класс импорта: SampleApp().

from basic import log
if __name__ == "__main__":
    app = log.SampleApp()
    app.mainloop()
4 голосов
/ 10 ноября 2010
from user import User 
from dir import Dir 
0 голосов
/ 26 января 2017

Просто слишком коротко, Создайте файл __init__.py, являющийся каталогом классов, и затем импортируйте его в свой скрипт, как показано ниже (Импортировать все регистры)

from classes.myscript import *

Импорт только выбранных классов

from classes.myscript import User
from classes.myscript import Dir
...