1、简单定义
理解: 在Python中,模块是代码组织的一种方式,把功能相近的函数放到一个文件中,一个文件(.py)就是一个模块(module)。模块名就是文件名去掉后缀py。
好处 :提高代码的可复用、可维护。一个模块编写完成后,可以更方便的在其他项目中导入。解决了命名冲突,不同模块中相同的命名不会冲突。
2、自定义模块
import 模块名
#调用
模块名.变量 、模块名.函数 、模块名.类
或者
from 模块名 import 变量、函数、类(导入模块中的某一部分)
在代码中可以直接使用变量、函数、类
或者
from 模块名 import *
导入模块中的所有内容,
但是如果想限制获取的内容,可以在模块中使用__all__ = [使用*可以访问到内容],但前提是都会加载进来。 #可以理解为白名单
特别注意: 无论是import还是from的形式,都会将模块内容加载进来。如果不希望其进行调用,就会用到__name__,在自己模块中__name__叫:__main__。如果在其他模块中通过导入的方式调用的话:__name__:模块名。
3、标准模块
可以参考: python标准模块
4、文件夹与包
-
基本概念
文件夹:非py文件 包:.py文件,一个包中可以存放多个模块。 from 包 import 模块 或者 from 包名.模块 import 变量、函数、类 from 包 import * 表示该包中内容(模块)是不能直接访问的,需要加 __all__ = ['模块名','模块名'] 才能直接调用模块。 即使在同一个包下的模块导入也要引入包名。也可以使用 .模块名表示同级模块(在同一个包中)
-
__init__.py文件
任何包中的__init__.py文件,当导入包的时候,默认首先调用__init__.py文件,并加载到内存!作用: 1.当导入包的时候,把一些初始化的函数,变量,类定义在__init__.py文件中。 2.此文件中函数,变量等的访问,只需要通过包名,函数.... 3.结合__all__ = [通过* 可以访问的模块]
5、循环导入
循环导入:大型的python项目中,需要很多python文件,由于架构不当,可能会出现模块之间的相互导入。
A:模块
def test():
f()
B:模块
def f():
test()
避免产生循环导入:
- 重新架构(工作量大,成本高)
- 将导入的语句放在函数里面
- 把导入语句放到模块的最后(if __name__ == ‘main’)