python模块的导入

君自故乡来,应知故乡事 / 2023-06-06 / 原文

一、模块的简介

1、什么是模块

Python 模块是一个 Python 文件,定义了各种功能接口

2、为啥使用模块

把复杂的功能封装为模块(又称为库),将功能实现的细节隐藏起来,使用该模块(库)的程序员不需要了解实现的细节。通过调用模块封装好的功能,

可以用仅仅几行 Python 代码实现某项复杂的功能,例如可以用一行代码就实现一个 Web 服务器。

3、模块的来源

  • 内置的(python解释器自带的直接用,eg:time)
  • 第三方的(别人写好的放在网上的,我们要想用,必须先下载才能用)
  • 自定义的(我们自己写的,以后也可以传到网上去)

4、在Python中,总共有以下四种形式的模块:

  • 自定义模块:如果你自己写一个py文件,在文件内写入一堆函数,则它被称为自定义模块,即使用python编写的.py文件
  • 第三方模块:已被编译为共享库或DLL的C或C++扩展
  • 内置模块:使用C编写并链接到python解释器的内置模块
  • 包:把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)

二、模块的导入

1、导入语法

import 句式

首次导入文件,会执行导入文件的代码
导入文件不管你导入几次,都只执行一次
导入文件的过程发生了什么事?
1. 运行执行文件,产生执行文件的全局名称空间
2. 运行md.py文件,会产生md文件的全局名称空间,把md文件里的名字都丢到md的全局名称空间去
3. 在执行文件中有一个md的变量,指向导入文件的空间地址
4. 以后我们在执行文件中就可以用md来点出导入文件中的名字
  导入文件之后,以后在用导入文件中的名字,只需要使用md点语法的形式点出来就可以
  不会与执行文件中的名字发生冲突,因为我们是指名道姓的取值

from 模块名 import *”

from md import money,read1,read2  # 一个模块下的不同函数,连续导入直观

通用导入

# from md import money, read1, read2, change,
from 模块名 import *

2、起别名

import xxx as xx

from xxx import xx as x

3、设置禁止被导用的部分模块功能

方式1:

设置私有属性

单下划线“_”或者双下划线“__”开头的变量、函数和类

##  导入文件
def say():
    print("人生苦短,我学Python!")
def CLanguage():
    print("C语言中文网:http://c.biancheng.net")
def _disPython():
    print("Python教程:http://c.biancheng.net/python")


##执行文件
from example import *
say()
CLanguage()
disPython()

方式2:

只有以“from 模块名 import *”形式导入的模块,当该模块设有 __all__ 变量时,只能导入该变量指定的成员,未指定的成员是无法导入的。

## 导入文件
def say():
    print("人生苦短,我学Python!")
def CLanguage():
    print("C语言中文网:http://c.biancheng.net")
def disPython():
    print("Python教程:http://c.biancheng.net/python")
__all__ = ["say","CLanguage"]


## 执行文件
from example import *
say()
CLanguage()
disPython()

###以“import 模块名”的形式导入模块,__all__ 变量即便设置,也形同虚设。
import example
example.CLanguage()
example.disPython()
example.say()


### 以“from 模块名 import 成员”的形式直接导入指定成员。使用此方式导入的模块,__all__ 变量即便设置,也形同虚设。
from example import say
from example import CLanguage
from example import disPython
say()
CLanguage()
disPython()

三、if __name__ == '__main__':的理解

1、目的

在Python中,if __name__ == '__main__':是一个常见的代码块,它的作用是使一个模块既可以被导入到另一个程序中,又可以作为一个独立的程序运行。

具体来说,当一个Python文件被执行时,Python解释器会将该文件中的所有代码都执行一遍,包括定义函数、变量等等。而当一个模块被导入到另一个程序中时,该模块中的所有代码也会被执行一遍,这可能会导致一些不必要的问题。

为了避免这种情况,我们可以使用if __name__ == '__main__':代码块。这个代码块中的代码只有在该文件作为主程序运行时才会被执行,而当该文件被作为模块导入时,这个代码块中的代码不会被执行。

2、案例

# example.py 导入文件
print('from example.py')

def my_function():
    print(__name__)

if __name__ == '__main__':
    my_function()

## test.py 执行文件
import example as e
# e.my_function()
print(__name__

结果:执行文件导入example模块,

my_function函数没有执行

print('from example.py') 立即执行

因为my_function函数做了 if __name__ == '__main__':条件判断,不会立马执行

要想执行被导入的函数,在执行文件中直接调用,没有了if条件,即可调用成功

import example as e
e.my_function()
print(__name__)