python3模块

wd404 / 2023-05-28 / 原文

1、类和函数的管理

如果只是少数的类或函数,可以将其写入到一个py文件中,相互之间直接使用即可。

但是,通常的项目往往涉及到非常多的类和函数,将其写入到一个py文件中是不适宜的,太过繁杂,且不便进行管理。

python中支持模块和包机制进行管理。

  • 模块:一个py文件即可称为一个模块,其中可以定义关系紧密的类和函数。
  • 包:py文件由可以由一层或多层文件夹进行组织管理,将这里的文件夹称之为包。

python中并不强调库。实际上,一般并不严格区分模块、包和库的定义,重点是掌握使用

2、导入

如果一个py文件中要使用其它py文件中声明的类或函数,则需要进行导入。

(1)import

import a.b
a.b.fun()
  • 直接使用import导入,必须是直接导入某py文件,而不能是某包。且使用时需要完整的py文件路径,比如是a.b而非b
import a.b as ab
ab.fun()
  • 使用as关键词,可以设置快捷名,以便使用

 (2)from ... import

from a import b
b.fun()
  •  用于导入指定py文件,如果有多个,可以用,分隔
from a.b import *
fun()
  •  导入某整个py文件

 3、导入事项

(1)一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。

(2)搜索路径被存储在sys模块中的path变量,python解释器会据此进行查找import导入的包。

import sys
print(sys.path)

(3)如果同名的函数或类在不同的模块中声明,且被同时引入,如果是直接使用函数或类,则实际使用的是后声明的。可以通过包名和模块名进行区分

4、__name__属性

一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。

if __name__=='__main__':
  pass

5、dir函数
内置的函数 dir() 可以找到模块内定义的所有名称。
如果没有给定参数,那么 dir() 函数会罗列出当前定义的所有名称.

import sys
print(dir(sys))

6、标准模块

由python本身所提供的标准的模块

7、使用

实际上,并不建议直接使用import或者from import *。

一方面引入过多未使用的子模块是占用资源,另一方面多个模块这么声明,很容易造成命名冲突。

显示的报错冲突还好,就怕隐性的错用,在项目开发和测试过程中未发现,但上线后造成业务问题或安全问题。

更好的操作是:导入子模块,在代码中使用模块名.类名或函数名进行操作。或者导入具体的子模块中的类或函数。

8、动态导入

__import__(name, globals=None, locals=None, fromlist=(), level=0) -> module
  • 该函数是builtins模块函数,用于动态加载模块
  • name,str类型,可以指向某个py文件,也可以指向某个包。但是必须存在,否则会报错
  • fromlist,tuple(str)类型,如果想加载其它包下的py文件,可以由name指向包,fromlist指向需要加载的py名

示例1:

# c.py是当前包下的其它模块
x=__import__('c')
# 调用c.py中的fun函数
x.fun()

 示例2:

# 导入a包下的b.py
x=__import__('a.b', fromlist=('b',))
# 调用b.py下的fun函数
x.fun()