Python基础(11)——模块和包

1、定义

​ 在python中,一个.py文件就是一个模块(module),在每个.py文件中,可以定义一系列封装类似功能的变量、函数、类等。包含多个.py文件的文件夹组成了一个(package),当然在这个文件夹中必须要包含一个__init__.py文件。他们都可以通过import语句导入。不论是一个单独的.py文件,还是一个包,我们都可以将其称为模块

2、模块的导入

2.1 使用import语句

语法格式如下:

  • import 模块名:在调用时,直接使用 模块名.功能名
  • import 模块名 as 别名:在调用时使用 别名.功能名
  • from 模块名 import 功能名:调用时直接使用功能名即可
  • from 模块名 import 功能名 as 别名:在调用时使用别名即可
  • from 模块名 import *:在调用时,直接使用模块中的功能名即可,但一般不推荐这样使用。

当然,如果模块中还分成了各个‘‘模块,可以直接在模块名后直接加.’模块名。

各种语法格式示例如下:

import os
import os as o
import os.path
import os.path as o_pth
from sys import path
from sys import path as pth
from matplotlib.pyplot import plot
from matplotlib.pyplot import plot as plt
from datetime import *

注意:

在执行import语句时,会按照以下顺序查找指定的模块:

  • 当前目录下
  • PythonPATH(环境变量)下中的每个目录中
  • Python默认的安装目录

当出现找不到模块时可以通过如下方式解决:

  • sys.path中添加模块的完整路径
  • 将模块放入sys.path中已经包含的路径下
  • 设置系统的环境变量

2.2 使用__import__导入

__import__是一个函数,用于动态加载模块,一般在日常编程中用不到。

__import__(name, globals=None, locals=None, fromlist=(), level=0)

它主要用于根据name导入模块。

name参数中可以有.号,如果fromlist参数为空,则会返回第一个.号之前的名称命名的包,而不是以name命名的模块,如果fromlist参数不为空,则返回以name命名的模块。

# 例如模块结构如下:
root
└─ test_pkg
│	├─ __init__.py
│   └─test1.py
└─demo.py

test1.py文件中定义了test()函数,要想从demo.py中通过__import__()函数导入它。

test1 = __import__("test_pkg.test1")
test1.test()

这样直接调用是不行的,会报错AttributeError: module 'test_pkg' has no attribute 'test'

也就是验证了上面所说的,fromlist中为空,则会返回第一个.号之前的名称命名的包。

这个fromlist参数没有任何要求,只要不为空,就可以正常返回name参数最右端的模块。

test1 = __import__("test_pkg.test1", fromlist=('t', 'f'))
test1.test()

这样就可以调用成功。

2.3 使用importlib导入模块

importlibpython的一个库,可以通过其中的import_module()方法来导入模块。

import importlib
test1 = importlib.import_module("test_pkg.test1")
test1.test()

上面是使用绝对路径导入模块的情况。我们还可以使用相对的路径来导入。

import importlib
test1 = importlib.import_module(".test1", package='test_pkg')
test1.test()

同样的都能成功导入模块。

3. 定义模块

最简单的就是将所有的功能、变量和类放到同一个.py文件中,在导入的时候直接导入即可。

如果是要定义一个模块,其中包含多个.py文件,则需要创建一个文件夹,在这个文件夹中需要有一个__init__.py文件。

__init__.py文件的主要作用就是将一个目录识别为package,标识这个文件夹是一个;第二个作用就是定义package中的__all__,用来模糊导入。

注:__all__的作用就是当该文件被当做模块导入时,只有在__all__中指定的方法或者类或者变量能够被访问到,只有在通过from module_name import *进行导入时会受到影响,其它import语句不受影响。

# test.py
__all__ = ['test']
def test():
    print("test")
def test1():
    print("test1")

# main.py
from test import *
test1()
# 执行main.py将会报错如下:
NameError: name 'test1' is not defined

在导入模块是,.py文件中的if __name__ == '__main__':后面的代码不会被执行。如果要测试该模块中的代码是否正确,可以将测试代码写在if __name__ == '__main__':之后。

__name__是一个变量,当直接使用python命令来运行一个模块的时候,__name__变量的值就是__main__,当其被导入其它程序中时,__name__变量就是模块名。

# test.py
def test__name__():
    print(__name__)

# main.py
import test as t
t.test__name__()

#运行main.py后的输入如下:
test

在模块中我们可以加入对模块的一些解释性文档,在模块的第一行代码之前定义"""文档"""即可,然后在其他程序调用该模块时,通过__doc__就可以查看模块的文档。

# test.py
"""
这是一个文档,其中定义了test方法
"""
def test():
    """
    这是test方法
    :return:
    """
    print("test")

# main.py
import test
print(test.__doc__) # 这里将返回整个文件最前面的文档内容。
print(test.test.__doc__) # 这里将返回函数下面定义的文档内容。

如果我们想要查看一个模块的源代码,但是找不到文件时,可以使用__file__属性来查看模块的源码路径,这会返回模块文件的绝对路径。

如有错误欢迎批评指正!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值