python模块和包

一. 模块

Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。

模块能定义函数,类和变量,模块里也能包含可执行的代码。

二. 导入模块

1. 语法:

import 模块名
from 模块名 import 功能名
from 模块名 import *
import 模块名 as 别名
from 模块名 import 功能名 as 别名

注意:这里的import后面的模块名一定是模块的全名(全路径名):即 包名.模块名

2. 示例:

2.1 定义模块:

创建mymodule.py文件,并编写方法sum,定义变量name:

def sum(a, b):
    return a+b

name = 'mymodule'

 

2.2 导入模块:

在demo.py 文件中导入并使用sum方法

2.2.1 "import 模块名" 方式导入模块
import mymodule

c = mymodule.sum(1, 2)
print(c)    # 3

说明:

1. 这种方法导入后,会导入模块中所有的内容

2. 功能调用方法:模块名.功能

2.2.2 "from 模块名 import 功能名" 方式导入模块
from mymodule import sum

c = sum(1, 2)
print(c)    # 3
print(name)     # NameError: name 'name' is not defined

说明:

1. 导入的时sum这个功能,因此调用时直接使用sum即可,不需要模块名. 的方式调用

2. mymodule模块中定义的其他功能没有导入,不可调用,如上面的name属性。

3. 也可在import后面使用逗号分隔导入多个功能如:

from mymodule import sum, name

c = sum(1, 2)
print(c)    # 3
print(name)     # mymodule

4. 如果需要导入模块所有功能,则import后面使用*号实现

from mymodule import *

c = sum(1, 2)
print(c)    # 3
print(name)     # mymodule
2.2.3 给导入的模块或功能取别名
import mymodule as cal

c = cal.sum(1, 2)
print(c)    # 3
from mymodule import sum as ss

c = ss(1, 2)
print(c)    # 3

说明:取别名后,只能使用别名

三. 自定义模块

在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字。也就是说自定义模块名必须要符合标识符命名规则。

创建一个.py的文件,并在文件中定义模块功能,即创建了一个模块,如上面的mymodule就是一个自定义的模块

3.1 模块中的__name__属性

__name__ 默认值为模块名,当前执行的.py文件的__name__的值自动被设置为"__main__"

import mymodule

print(__name__)  # __main__
print(mymodule.__name__)    # mymodule

说明

1. 当前执行的文件,此属性值为"__main__",而导入的mymodul模块的此属性值为模块名:mymodule

2. 一般使用这一特点定义测试代码,如在mymodule 中定义测试代码:

def sum(a, b):
    return a+b

name = 'mymodule'

if __name__ == '__main__':
    print("测试代码")

3.  如果没有 if __name__ == '__main__': 这行代码,当通过import mymodule方式导入模块时,测试代码会执行,而使用了这个判断后,由于在别的模块导入后,mymodule模块的名称为mymodule,测试代码不会执行

四. 模块定位顺序

当导入一个模块,Python解析器对模块位置的搜索顺序是:

1. 当前目录
2. 如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
3. 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/

模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。

- 注意
- 自己的文件名不要和已有模块名重复,否则导致模块功能无法使用
- `使用from 模块名 import 功能`的时候,如果功能名字重复,调用到的是最后定义或导入的功能。

from mymodule import sum

def sum(a, b):
    return 100

print(sum(1, 2))    # 100
def sum(a, b):
    return 100

from mymodule import sum

print(sum(1, 2))    # 3

说明:

1.总规则:后定义的会覆盖先定义的

2.上面代码中后导入mymodule则sum使用的mymodule中的sum,否则使用的是当前文件的sum

3. import 模块名的时候,不用担心功能名称重复,因为是通过模块名.功能的方式调用。不过要注意模块名与其他变量名称重复

五. `__all__`

如果一个模块文件中有`__all__`变量,当使用`from xxx import *`导入时,只能导入这个列表中的元素。

在mymodule中添加`__all__`属性:

__all__ = ['sum']   #使用字符串,而不是变量
def sum(a, b):
    return a+b

name = 'mymodule'

导入所有功能并调用:

from mymodule import *

print(sum(1, 2))    # 3
print(name) # NameError: name 'name' is not defined

说明:

1. __all__列表中使用字符串,而不是变量

2. 上面的name没有放在all列表中,因此导入全部功能后,不包括name

六. 包

1.包

包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为`__init__.py` 文件,那么这个文件夹就称之为包。

2.新建包

[New] — [Python Package] — 输入包名 — [OK] — 新建功能模块(有联系的模块)。

注意:新建包后,包内部会自动创建`__init__.py`文件,这个文件控制着包的导入行为。

新建包mypackage和包中的模块mymodule1

def print_m():
    print("module1...")

3. 在demo.py中导入包中的模块

3.1 包名.模块名 方式导入

语法

import 包名.模块名

包名.模块名.目标功能

示例:

import mypackage.mymodule1

mypackage.mymodule1.print_m()   # module1...

3.2 from 包名 import * 导入包中的模块

这种方法导入模块,必须在`__init__.py`文件中添加`__all__ = []`,控制允许导入的模块列表。如果列表为空,则无法导入任何模块

示例:

不在__init__.py中添加__all__列表时:

from mypackage import *

mymodule1.print_m()   # NameError: name 'mymodule1' is not defined

添加__all__列表并指定可导入模块:

__all__ = ["mymodule1"]

再次执行:

from mypackage import *

mymodule1.print_m()   # module1...

 

posted @ 2020-12-27 15:35  foreast  阅读(132)  评论(0编辑  收藏  举报