Python3之模块和包

一、模块

1、模块定义

模块是一个包含所有已定义的函数和变量的文件,文件后缀名为.py。模块可以被其他程序引用,以使用该模块下的函数和变量

注意:

  • 模块名要遵循Python变量命名规范,不要使用中文、特殊字符;
  • 模块名不要和系统模块名冲突,可以先查看系统是否已存在该模块,检查方法是在Python交互环境执行import abc,若成功则说明系统已存在此模块;

Python导入模块顺序:

  • 当前目录,即当前执行的程序文件所在目录下查找;
  • 到 PYTHONPATH(环境变量)下的每个目录中查找;
  • 到 Python 默认的安装目录下查找;

以上所有涉及到的目录,都保存在标准模块 sys 的 sys.path 变量中,通过此变量我们可以看到指定程序文件支持查找的所有目录。换句话说,如果要导入的模块没有存储在 sys.path 显示的目录中,那么导入该模块并运行程序时,Python 解释器就会抛出 ModuleNotFoundError(未找到模块)异常。

2、import语句

语法:import module1[, module2[,... moduleN]

不管执行了多少次import语句,一个模块仅会被导入一次

3、from … import 语句

from ... import语句可实现从一个模块中导入指定的部分到当前模块,语法为:

from modname import name1[, name2[, ... nameN]]

4、from … import * 语句

from … import * 语句可实现把一个模块中所有内容均导入到当前模块,语法为:

from modname import *

5、深入模块

模块除了方法定义,还可以包括可执行的代码,这些代码一般用来初始化这个模块,这些代码只有在第一次被导入时才会被执行;

可以使用 import 直接把模块内(函数,变量)名称导入到当前操作模块,这种导入的方法不会把被导入的模块的名称放在当前的字符表中

6、__name__属性

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

说明: 每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入

"""
__name__属性
当一个模块被另一个程序第一次引入时,其主程序将运行,如果我们想在模块被引入时,模块中的某一程序块不执行,
则可以用__name__属性来使该程序块仅在该模块自身运行时执行
"""
if __name__ == '__main__':
   print('程序自身在运行')
else:
   print('我来自另一模块')

def sum(num1, num2):
   """加法"""
   return print(num1 + num2)

def mult(num1, num2):
   """乘法"""
   return print(num1 * num2)

运行using_name.py输出结果:程序自身在运行

另一个模块name.py中引用using_name.py,运行name.py模块,输出结果:我来自另一模块

7、dir() 函数

内置函数 dir() 可以找出模块内定义的所有名称,并以一个字符串列表的形式返回

"""
__name__属性
当一个模块被另一个程序第一次引入时,其主程序将运行,如果我们想在模块被引入时,模块中的某一程序块不执行,
则可以用__name__属性来使该程序块仅在该模块自身运行时执行
"""
if __name__ == '__main__':
   print('程序自身在运行')
else:
   print('我来自另一模块')

def sum(num1, num2):
   """加法"""
   return print(num1 + num2)

def mult(num1, num2):
   """乘法"""
   return print(num1 * num2)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'mult', 'sum']

 8、Python导入模块的三种方式

解决“Python找不到指定模块”的方法有 3 种,分别是:

  • 向 sys.path 中临时添加模块文件存储位置的完整路径;
  • 将模块放在 sys.path 变量中已包含的模块加载路径中;
  • 设置 path 系统环境变量;

Runoob项目下,存在一个包ZX_package,有个模块“ZX_任意个数的任意次幂求和”,模块中有个函数Sum_Of_Squares,具体路径为:E:\Mine\Python\Runoob\ZX_Package\ZX_任意个数的任意次幂求和.py

另一个模块example.py 程序文件,路径为:C:\Users\mengma\Desktop\example.py

A)、向 sys.path 中临时添加模块文件存储位置的完整路径

模块文件的储存位置,可以临时添加到sys.path中,即向sys.path中添加被导入模块的路(被调用模块“ZX_任意个数的任意次幂求和.py”的存储路径“E:\Mine\Python\Runoob\ZX_Package”),在调用模块的开头位置添加如下代码:

# example.py文件开头

import sys

sys.path.append('E:\\Mine\\Python\\Runoob\\ZX_Package')

路径添加到.py文件的上一级目录(文件夹,即包名package),使用import  模块名导入模块,使用模块名.函数名调用函数

注意:在添加完整路径中,路径中的 '\' 需要使用 \ 进行转义,否则会导致语法错误

B)、将模块放在 sys.path 变量中已包含的模块加载路径中

使用sys.path可输出Python 所有的默认模块加载路径,但通常来说,我们默认将 Python 的扩展模块添加在 lib\site-packages 路径下,它专门用于存放 Python 的扩展模块和包。

使用from 包名 import 模块名导入模块,使用模块名.函数名调用函数

C)、设置环境变量

环境变量中设置用户或者系统变量,变量名输出:PYTHONPATH,变量值输入:.;E:\Mine\Python\Runoob\ZX_Package,其中E:\Mine\Python\Runoob\ZX_Package为包的存储路径

二、包(Package)

1、定义

包是一种管理 Python 模块命名空间的形式,采用"点模块名称",如一个模块的名称是 A.B,则表示一个包 A中的子模块 B 。

注意:

  • 每一个包目录下面都会有一个__init__.py文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包;
  • 当使用 from package import item 这种形式的时候,对应的 item 既可以是包里面的子模块(子包),或者包里面定义的其他名称,比如函数、类、变量;

    import 语法会首先把 item 当作一个包定义的名称,如果没找到,再试图按照一个模块去导入,如果还没找到,抛出一个 :exc:ImportError 异常。

  • 如果使用形如 import item.subitem.subsubitem 这种导入形式,除了最后一项subsubitem,其他都必须是包,而最后一项则可以是模块或者是包,但是不可以是类、函数、变量的名字;

一个包结构:

sound/                          顶层包
      __init__.py               初始化 sound 包
      formats/                  文件格式转换子包
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  声音效果子包
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  filters 子包
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...

2、包导入子模块

A)、导入子模块echo方法一

语法:
import sound.effects.echo
方法一会导入子模块“sound.effects.echo”,当需要调用echo模块下函数时,必须使用全名访问echo模块下函数,即sound.effects.echo.echofilter(values)

B)、导入子模块echo方法二

语法:

from sound.effects import echo

方法二会导入子模块“echo” ,当需要调用echo模块下函数时,可以使用echo.echofilter(values)

C)、直接导入一个函数或者变量

语法:

from sound.effects.echo import echofilter

方法三会导入子模块“echo” ,因此可以直接使用他的 echofilter() 函数

3、从一个包中导入*

  • 导入语句遵循如下规则:如果包定义文件 __init__.py 存在一个叫做 __all__ 的列表变量,那么在使用 from package import * 的时候就把这个列表中的所有名字作为包内容导入,因此需要在更新包以后及时更新__all__ 列表变量
  • 推荐使用from Package import specific_submodule如果在结构中包是一个子包(如sound/filters/vocoder),此时想导入兄弟包(sound/effects/echo),必须使用导入绝对的路径来导入。比如,如果模块sound.filters.vocoder 要使用包 sound.effects 中的模块 echo,就要写成 from sound.effects import echo;

参考文档:

https://www.jianshu.com/p/d87a1d09664b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值