如何导入同一目录或子目录中的类?

我有一个存储所有. py文件的目录。

bin/main.pyuser.py # where class User residesdir.py # where class Dir resides

我想在main.py中使用user.pydir.py中的类。
如何将这些Python类导入main.py
此外,如果user.py在子目录中,我如何导入类User

bin/dir.pymain.pyusr/user.py
1509477 次浏览
from user import Userfrom dir import Dir

python2

在与文件相同的目录中创建一个名为__init__.py的空文件。这将向Python表示“可以从此目录导入”。

那就做…

from user import Userfrom dir import Dir

如果文件位于子目录中,情况也是如此-在子目录中也放置__init__.py,然后使用常规导入语句,使用点表示法。对于每个级别的目录,您需要添加到导入路径。

bin/main.pyclasses/user.pydir.py

所以如果目录被命名为“类”,那么你会这样做:

from classes.user import Userfrom classes.dir import Dir

python3

与之前相同,但如果不使用子目录,则在模块名称前加上.

from .user import Userfrom .dir import Dir

在你的main.py

from user import Class

其中Class是您要导入的类的名称。

如果你想调用Class的方法,你可以使用:

Class.method

请注意,同一目录中应该有一个空的__init__.py文件。

为了使它更容易理解:

第1步:让我们转到一个目录,其中包含所有内容

$ cd /var/tmp

第2步:现在让我们制作一个class1.py文件,该文件具有类名Class1和一些代码

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

第3步:现在让我们制作一个class2.py文件,该文件具有类名Class2和一些代码

$ cat > class2.py <<\EOFclass Class2:OKBLUE = '\033[94m'ENDC = '\033[0m'OK = OKBLUE + "[Class2 OK]: " + ENDCEOF

第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.OKprint Class2.OKEOF

第5步:运行程序

$ python main.py

输出将是

[Class1 OK]:[Class2 OK]:

如果您不想将函数和类与您的函数和类混合,您可以导入模块并通过其名称进行访问

import util # imports util.py
util.clean()util.setup(4)

或者您可以将函数和类导入您的代码

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

您可以使用Wildchar*将该模块中的所有内容导入您的代码

from util import *clean()setup(4)

我刚刚了解到(感谢马蒂诺的评论),为了从同一目录中的文件导入类,您现在可以用Python 3编写:

from .user import Userfrom .dir import Dir

太短了,创建一个文件__init__.py是类目录,然后将其导入到您的脚本中,如下所示(导入所有大小写)

from classes.myscript import *

仅导入选定的类

from classes.myscript import Userfrom classes.myscript import Dir

python3


相同的directory

导入文件:log.py

导入类:SampleApp()

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

目录是basic

导入文件:log.py

导入类:SampleApp()

from basic import logif __name__ == "__main__":app = log.SampleApp()app.mainloop()

从python3.3开始,__init__.py不再需要。如果控制台的当前目录是python脚本所在的目录,那么一切都可以正常工作

import user

但是,如果从不包含user.py的不同目录调用,这将不起作用。
在这种情况下,使用

from . import user

即使您想导入整个文件而不仅仅是从那里导入一个类,这也有效。

从同一目录导入

from . import the_file_you_want_to_import

要从子目录导入,目录应包含

init.py

文件以外的其他文件

从目录导入your_file

如果user.py和dir.py不包括类

from .user import Userfrom .dir import Dir

不起作用。然后您应该导入为

from . import userfrom . import dir

python3

使用

from .user import User inside dir.py file

use from class.dir import Dir inside main.pyor from class.usr import User inside main.py

像这样

我不知道为什么这个工作,但使用Py魅力构建from file_in_same_dir import class_name

IDE抱怨它,但它似乎仍然有效。我正在使用Python 3.7

对于python3

从兄弟姐妹导入:from .user import User
#from .usr.user import User

如果您在同一个文件夹中有filename.py,您可以像这样轻松导入它:

import filename

我用的是python3.7

# My Python version: 3.7# IDE: Pycharm 2021.1.2 Community
# Have "myLib" in folder "labs":
class Points:def __init__(self, x = 0, y = 0):self.__x = xself.__y = ydef __str__(self):return f"x = {self.__x}, y = {self.__y}"
# Have "myFile" in (same) folder "labs":
from myFile import Point
p1 = Point(1, 4)p2 = Point(1, 4)print(f"p1: {p1}, p2: {p2}")
# Result:# p1: x = 1, y = 4, p2: x = 1, y = 4
# Good Luck!

对于Python 3+,假设你有这样的结构:

A/__init__.pybar.pyfoo.py

在你的__init__.py文件中,你可以把from . import foo

然后你可以在bar文件中导入foo

# A/bar.pyfrom foo import YourClass

__init__.py文件的目的是包含可选的初始化代码,该代码在遇到包的不同级别时运行。您放在__init__.py中的所有内容都将在包加载期间初始化。