包和模块

一、模块

1、什么是模块
在Python中,一个.py文件就称之为一个模块
模块分为三种:
1、内置标准模块(又称标准库)执行help(‘modules’)查看所有python自带模块列表
2、第三方开源模块,可通过pip install 模块名 联网安装
3、自定义模块
使用模块好处:
1、最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引 用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。
2、使用模块还可以避免函数名和变量名冲突。每个模块有独立的命名空间,因此相同名字的函数和变量完全可以分别存在不同的模块中,所以,我们自己在编写模块时,不必考虑名字会与其他模块冲突
2、模块导入方法
创建一个名为my_moudle.py的文件,最为自定义模块

# my_moudle.py

money=1000

def read1():
    print('my_moudle->read1->money',money)

def read2():
    print('my_moudle->read2 calling read1')
    read1()

def change():
    global money
    money=0

在同级目录下创建一个文件new_moudle.py

# import  my_moudle
import my_moudle
my_moudle.read1()

# from pritice import my_moudle
from pritice import my_moudle
my_moudle.read1()

# from my_moudle import read1 as read2  
from my_moudle import read1 as read2
read2()

# from my_moudle import *      
from my_moudle import *
read2()
注意:把my_moudle中所有的不是以下划线(_)开头的名字都导入到当前位置,大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。
当然也可以在my_moudle.py中新增一行__all__=['money','read1'],这样在另外一个文件中用from my_moudle import *就这能导入列表中规定的两个名字
 

3、模块搜索路径
python解释器在启动时会自动加载一些模块,可以使用sys.modules查看。
在第一次导入某个模块时(比如my_moudle),会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),如果有则直接引用。
如果没有,解释器则会查找同名的内建模块,如果还没有找到就从sys.path给出的目录列表中依次寻找my_moudle.py文件。
所以总结模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块
需要特别注意的是:我们自定义的模块名不应该与系统内置模块重名。虽然每次都说,但是仍然会有人不停的犯错。
在初始化后,python程序可以修改sys.path,路径放到前面的优先于标准库被加载。

import sys

print(sys.path)
输出:['D:\\practice Python code\\untitled\\pritice\\p1', 'D:\\practice Python code\\untitled', 'D:\\practice Python code\\untitled\\第二模块:函数编程\\ATM\\bin', 'D:\\practice Python code\\untitled\\第二模块:函数编程\\ATM\\conf', 'D:\\practice Python code\\untitled\\第二模块:函数编程\\ATM\\core', 'D:\\practice Python code\\untitled\\第二模块:函数编程\\ATM\\db', 'D:\\practice Python code\\untitled\\第二模块:函数编程\\ATM\\log', 'D:\\practice Python code\\untitled\\第二模块:函数编程\\ATM', 'C:\\Users\\夏天\\PycharmProjects\\untitled\\venv\\Scripts\\python37.zip', 'C:\\Python37\\DLLs', 'C:\\Python37\\lib', 'C:\\Python37', 'C:\\Users\\夏天\\PycharmProjects\\untitled\\venv', 'C:\\Users\\夏天\\PycharmProjects\\untitled\\venv\\lib\\site-packages', 'C:\\Users\\夏天\\PycharmProjects\\untitled\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.7.egg', 'C:\\Users\\夏天\\PycharmProjects\\untitled\\venv\\lib\\site-packages\\pip-10.0.1-py3.7.egg', 'D:\\Program Files\\JetBrains\\PyCharm 2018.3.1\\helpers\\pycharm_matplotlib_backend']

搜索时按照sys.path中从左到右的顺序查找,位于前的优先被查找,只要在一个目录下匹配到了该模块名,就立刻导入,不再继续往后找。sys.path中还可能包含.zip归档文件和.egg文件,python会把.zip归档文件当成一个目录去处。
注意:如果列表第一个元素为空,即代表当前目录,所以你自己定义的模块在当前目录会被优先导入。

二、包

python包是:包是一个有层次的文件目录结构,它定义了由n个模块或n个子包组成的python应用程序执行环境。
通俗一点:包是一个包含__init__.py 文件的目录,该目录下一定得有这个__init__.py文件和其它模块或子包。
.
└── my_proj
├── crm #代码目录
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
└── my_proj #配置文件目录
├── settings.py
├── urls.py
└── wsgi.py
1. 无论是import形式还是from…import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法。

  1. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录。

  2. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件。

  3. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错。

  4. 创建包的目的不是为了运行,而是被导入使用,包只是模块的一种形式而已,包即模块。

1、包的导入
包相关的导入语句也分为import和from … import …两种,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。
不管是哪种方式,只要是第一次导入包或者是包的任何其他部分,都会依次执行包下的__init__.py文件,这个文件可以为空,但是也可以存放一些初始化包的代码。

2、绝对导入和相对导入
我们的最顶级包my_proj是写给别人用的,然后在my_proj包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式:
1、绝对导入:以my_proj作为起始

2、相对导入:用.或者…的方式最为起始(只能在一个包中使用,不能用于不同目录内)

我们在my_proj/crm/ views.py中想要导入my_proj/my_proj/settings.py

#绝对导入
from my_proj.crm import views
views.main()

#相对导入
from ..cr import views
views.main()

注意:虽然python支持相对导入,但对模块间的路径关系要求比较严格,处理不当就容易出错,并不建议在项目里经常使用。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值