Python中的模块与包

本文详细介绍了Python中的模块和包。模块是包含Python定义和语句的文件,分为系统模块和自定义模块;包则是一个包含多个模块的文件夹结构,通过`__init__.py`进行组织。导入模块有绝对导入、相对导入和搜索路径等方式,同时文章还讨论了单入口程序的概念。
摘要由CSDN通过智能技术生成

Python中的模块与包

1.模块:就是python脚本

定义的一个python的文件,后缀名为.py。这个文件被称为模块。

模块中通常会定义一些相似的 类,函数等代码内容,提供给别的程序引入后使用。

1.1 系统模块:之前讲的内置模块

系统模块就是一个python的程序脚本,专门提供给我们自己的程序使用。它们是在安装好python环境时,就已经存在的,需要的时候可以使用 import 导入到程序中使用。

import os,zipfile,json,shutil,time

1.2 自定义模块

就是自己创建一个python脚本,定义一些类或方法,供别的脚本导入后使用。

【自己创建一个python脚本a,里面定义了函数func(),那么在python脚本b中,参数 = a.func(),就可以调用a里面的函数func()】

【自定义模块中,通常只是去定义类或函数、变量等,并不调用】

定义一个test.py文件,如下

#test.py

#定义类
class Ceshi():
    pass

#定义函数
def func():
    print('自定义模块!')

#定义变量
a = '这是个字符串!'

在test1脚本中就可以导入test模块,使用里面的类、函数和变量

import test   #导入自定义的test模块

#使用模块中定义的类
obj = test.Ceshi()
print(obj)

#使用模块中定义的函数
test.func()

#使用模块中定义的变量
print(test.a)

>>><test.Ceshi object at 0x000001C08DFAC7C8>
   自定义模块!
   这是个字符串!

【想使用模块中的内容时,除了导入模块,还可以在在指定模块中导入指定的内容】

from test import a   #导入test模块中的a变量
print(a)
func()    #此时没有导入func函数,这里会报错 
>>>这是个字符串!

from test import a
from test import func    #导入函数时候注意只导入函数名!带括号就是调用函数了!
func()
print(a)
>>>自定义模块!
   这是个字符串!
    
from test import a as b   # 导入test模块中的a变量,并修改它的名字
print(b)
>>>这是个字符串!
#此时print(a)就会出错

###1.3 模块中的测试代码

【如果在自定义模块中,想要写一些测试代码,在当前模块作为主程序使用时执行,而作为模块被别的程序导入时不执行,那么可以把测试代码写到 下面代码块中】

if __name__ == '__main__':
    print('这里写的代码只有当前脚本被直接运行时触发,被别的脚本调用时不会触发')

【特殊的变量_name_】:

__name__变量,在当前脚本作为模块被别的程序导入时,值为当前这个模块的名称
在当前脚本被作为主程序直接由python解析运行时,__name__的值是 '__main__'
所以这里要做判断:if __name__ == '__main__':
只有当前脚本被作为主程序运行时,才会显示运行里面的代码


#例
#在自定义模块test.py里print自己的__name__,值就是'__main__'
print(__name__)      #这里的代码写在自定义模块test.py里
>>>__main__


#在主程序test1.py里print导入的自定义模块的__name__,值就是自定义模块的名称
print(test.__name__)   #这里的代码写在主程序test1.py里
>>>test

'''
如果自定义模块里有print(__name__),
那么在主程序里不需要写print(test.__name__),
在运行主程序的时候就会打印出自定义模块的名字
'''

【当python程序当中引用了自定义模块时,脚本所在目录下就会多一个名为__pycache__的缓存文件夹 】

##2.包

包可以理解为是一个文件夹,里面包含了多个python文件,每个文件都是一个模块。

2.1 包的结构

'''
package/   # 包(文件夹)
├── __init__.py  # 包中的标志性文件,必须有,但里面可以没有内容
├── a.py         # 包中的a模块(文件)
├── b.py         # 包中的b模块(文件)
└── ps/   # 子包(文件夹中的文件夹)
  ├── __init__.py #子包中的标志性文件
  ├── c.py
  └── d.py
'''

2.2 包的使用方法

定义了一个包ceshibao,里面有mukuai1.py,mukuai2.py,_init_.py,还有一个子包subCeshi

其中mukuai1.py里的内容为

def func1():
   return('这是包里的自定义模块1')

其他自定义模块同上,只有数字不同

  • from package import b 导入指定包中的指定模块b

    from ceshibao import mukuai1,mukuai2
    a = mukuai1.func1()
    b = mukuai2.func2()
    print(a)
    print(b)
    >>>这是包里的自定义模块1
       这是包里的自定义模块2
    
  • from package.a import b 从指定包的指定模块a中导入指定的内容b

    from ceshibao.mukuai1 import func1
    a = func1()
    print(a)
    >>>这是包里的自定义模块1
    #这时就不能写 a = mukuai1.func1()
    
  • from package.sub import b 从指定包的子包sub中导入指定模块b

    from ceshibao.subCeshi import  mukuai3
    a = mukuai3.func3()
    print(a)
    >>>这是包里的自定义模块3
    
  • from package.sub.a import b 从指定包的子包sub中的指定模块a中导入指定的内容b

    from ceshibao.subCeshi.mukuai4 import  func4
    a = func4()
    print(a)
    >>>这是包里的自定义模块4
    
  • (不推荐)直接把包当作模块导入,可以用的内容是_init_.py文件中定义的

  • from package import *

    # 可以导入模块中的所有内容
    # 注意这个内容是由 __init__.py文件中定义的 __all__ 这个变量指定的模块
    # 好处是可以直接导入指定的所有模块,并且使用时,直接使用指定的模块名即可
    
  • 注意这个内容是由 __init__.py文件中定义的 __all__ 这个变量指定的模块
    
  • 注意这个内容是由 __init__.py文件中定义的 __all__ 这个变量指定的模块
    
  • 注意这个内容是由 __init__.py文件中定义的 __all__ 这个变量指定的模块
    

3.导入方式的分类

3.1 绝对导入

# 绝对导入的方式会使用[搜索路径]去查找和导入指定的包或模块
import 模块
importimport.模块
from 模块 import 内容
fromimport 模块
from.模块 import 内容

3.2 相对导入

注意:相对导入只能在非主程序的模块中使用,不能在当前直接运行的脚本中使用【不要直接运行用了相对导入的模块的文件】

# 相对导入 
from .包名/模块名 import 模块/内容
from ..包名/模块名 import 模块/内容

. 代表当前
..代表上一级

【假设在之前建的子包里的mukuai3模块中需要使用当前包中的mukuai4模块】

#mukuai3.py中的代码为:
from .mukuai4 import func4
print(func4())
def func3():
    return('这是包里的自定义模块3')

#主程序baotest.py中的代码为:
from ceshibao.subCeshi import  mukuai3
a = mukuai3.func3()
print(a)
>>>这是包里的自定义模块4
   这是包里的自定义模块3 
#同样也可以把mukuai3.py中的导入mukuai4模块的代码写为:
from ..subCeshi.mukuai4 import func4
print(func4())

#或者
from ..subCeshi import mukuai4
print(mukuai4.func4())
#子包中的mukuai3.py中导入包ceshibao中的mukuai1的代码为:
from .. import mukuai1
print(mukuai1.func1())

3.3 搜索路径

在导入模块或包时,程序查找的路径

'''
主要的搜索路径
1. 当前导入模块的程序所在的文件
2. python的扩展目录中
3. python解释器指定的其它 第三方模块位置
'''
# 在当前脚本中查看 包或模块 的 搜索路径
import sys
print(sys.path)
'''
['D:\\学习笔记\\新职课\\第五章-模块,包与库训练\\第四节', 'D:\\学习笔记\\新职课\\第五章-模块,包与库训练', 'F:\\Anaconda\\Anaconda\\python37.zip', 'F:\\Anaconda\\Anaconda\\DLLs', 'F:\\Anaconda\\Anaconda\\lib', 'F:\\Anaconda\\Anaconda', 'F:\\Anaconda\\Anaconda\\lib\\site-packages', 'F:\\Anaconda\\Anaconda\\lib\\site-packages\\win32', 'F:\\Anaconda\\Anaconda\\lib\\site-packages\\win32\\lib', 'F:\\Anaconda\\Anaconda\\lib\\site-packages\\Pythonwin']
'''

# 可以自己定义一个路径,加入到搜索路径中
import sys
sys.path.append('E:')
print(sys.path)
>>>#此时就在打印出来的列表最后多了个'E:'

4. 单入口程序

单入口程序是指整个程序都是经过一个主程序文件在运行,其它程序都封装成了包或模块

# 单入口文件是作为程序直接被运行的唯一文件,其它都是作为模块或包,被导入单入口中去执行
'''
以ATM机为例
ATM/
|---- main.py  # 当前程序的主入口文件,单入口文件,唯一直接运行的文件
|---- package/ # 主要程序模块包
|---- |----- __init__.py  # 包的初始化文件
|---- |----- View.py      # 视图函数模块
|---- |----- Controller.py# 控制器模块
|---- |----- Card.py      # 银行卡模块
|---- |----- User.py      # 用户模块
|---- databases/ # 数据存储文件夹
|---- |---- user.txt
|---- |---- user_id_card.txt

main是程序的主入口文件,会被直接作为主程序运行,所以main.py文件中必须使用 绝对导入 方式
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值