模块:一个以.py结尾的文件。模块里包含了我们的一些全局变量/函数的定义/类的定义等。
包:一个包含有__init__.py的文件夹,叫做一个包,里面放了一些模块(.py文件)
print("Importing module B")
# from A import hello
"""
单使用import,需要import <模块>
"""
import A # A是一个模块,
#单用"iport"导入, 必须要定位到模块这一层级
A.hello() #使用模块里定义的函数, 可以用这种.的方式
"""
使用from <模块> import <func / class / GLOBAL_VAR>
"""
from A import hello
hello()
"""
可以通过as对导入的<func / class / GLOBAL_VAR>进行重命名
"""
from A import hello as h
h()
"""
下面这样使用是不对的,因为A不是一个package (有__init__.py这样一个空文件的文件夹,这个文件夹才是
一个package,里面放了很多的module(.py文件)
"""
import A.hello as hello # 这句报错,因为A不是一个包(package)
def world():
print("World from B")# -*- coding: utf-8 -*-
那么这个程序打印的是什么呢:
Importing module B 第一句
Importing module A 在import A的时候运行的
Importing module C 在import A的h时候,导入C的时候运行的
Hello from A # A.hello()输出
Hello from A # hello()输出
Hello from A # h()输出
# 运行from A import hello /from A import hello as h 没有再输出Importing module A和Importing module C,是因为在 import A 时就已经导入过A模块了。
原则:
包里还可以有子包
import <模块>
import <module.func>: 错! module不是package,点前面应该是package
from <模块> import <func/class/GLOBAL_VAR> as XX
from <package.module> import <func/class/GLOBAL_VAR>
层级:包(包含有__init__.py的folder) include 模块(.py), 模块里有一些func和class之类的定义
参考:
https://pythonhowto.readthedocs.io/zh-cn/latest/module.html
from . import_python首行代码import *,from * import * 解析-CSDN博客
Python在解析导入时会按照以下顺序查找模块或包:
当前工作目录 - Python首先会在当前工作目录中查找
系统路径 - 如果在当前工作目录中找不到,Python会继续搜索系统路径中的其他位置。
---------------------------------------------------------------------------------------------------------
下面看一个练习:
有这样一个文件结构,然后在class_A.py中定义了一个func()函数
看看在main.py中这些import那些正确那些不正确呢?
from class_package.class_folder import class_A
正确,从当前工作目录中的class_package包中找到这个文件夹,从文件夹中导入module class_A
from class_folder.class_A import func
这个也正确!但是不太很规范!因为class_folder不是一个包
问题,这个竟然也正确,class_folder不是一个package呀,怎么能放在.前面呢?
答:Python在解析导入时会按照以下顺序查找模块或包:
(1)当前工作目录 -
!!!!!
Python首先会在当前工作目录中查找是否存在名为class_folder的【文件夹】或者【package】。
!!!!
(2)系统路径 - 如果在当前工作目录中找不到,Python会继续搜索系统路径中的其他位置。
----------------------------------------------------------------------------------
在您的情况下,虽然class_folder本身并没有被明确声明为一个 Python 包(没有__init__.py文件),
但Python仍会尝试解析导入路径。这种灵活性让您可以从文件夹中导入模块,
但也可能导致一些混淆和潜在的问题,特别是在复杂项目中。
----------------------------------------------------------------------------------
from class_folder import class_A
正确,就是从当前路径下的文件夹中导入一个module
from class_package.class_folder.class_A import func
错误了! 因为class_folder并不是在当前目录下的文件夹,class_package.class_folder必须也得
是一个package才行!
总结:
最规范:from package.module import func()/class/GLOBAL_VAR
python灵活处理:(可以看出,python仅接受将当前工作路径下的文件夹“看作”一个package来宽松对待,对于不在当前工作路径下的文件夹,不能放在.前面。
from 当前工作目录下的文件夹.module import func()/class/GLOBAL_VAR
错误:对应上面的灵活处理
from 当前路径package.folder.module import XXX