包引用
python有丰富的包,pypi网站是python包的搜索平台。
包package:
组织各个py脚本文件和其他配置、静态文件等。项目由包组成的,确定项目组织的层次结构。说白了就是写好的代码,封装。
内置包
除了pypi网站,python解释器已经内置了一些常用的包,可以安装目录/Lib sitepackages目录下看到。
第三方包
程序员上传到pypi网站上的包,直接拿来用,而不需要从头开发,大大提高了开发效率。
包的好处:组织项目结构更加清晰;命名空间隔离,不同包下可以有同名文件。
小知识:
__init__.py:包类似windows资源管理器上的文件夹。只是这个文件夹下有一个(双下划綫)__init__.py的文件
(双下划綫)__init__.py作用:
1.说明是一个包而不是一个文件夹。__init__.py 可以为空。
2.控制包的具体行为,功能比文件夹更强,相当于升级版的文件夹。
3.项目的初始化逻辑。例如:声明一个类的实例;初始化数据库连接;初始化项目运行环境。
一个包下必须要有__init__.py文件,__init__.py文件可以为空。
引用语法(import引入)
执行import语句时,python解释器会自动在包安装目录下查找同名包。
1.import 包名:引用包中的所有py文件。如:import L8包.package.pack1 ,表示:在L8包文件夹下package子文件夹下的pack1.py文件
2.from 包名.py脚本 import 包中的类,包中的方法,包中的变量:用什么引什么
简写 [ from 包名.py脚本 import *] 如:from L8包.package.pack1.py1 import *,表示:在L8包文件夹下package子文件夹下的pack1.py文件
3.from包.子包 import 子包里的py脚本。如:from L8包.package.pack1 import py1 ,表示:在L8包文件夹下package子文件夹下的pack1.py文件
包的查找路径:
import包的时候,python解释器会首先从项目根目录下开始查找符合的包名。如果未找到再去 解释器安装目录/Lib、 安装目录/Lib/sitepackages 目录下查找内置包或第三方包。
小知识:
解析 if __name__ == '__main__': pass
__name__ : 内置的特殊值,返回文件名。
1. 当.py自己执行时, __name__ 的值为 '__main__', 表示主函数、入口文件。
2. 当.py被另一个脚本文件import时,__name__ 的值为
包层级结构.文件名 。
场景:.py文件中有写好的类、函数、测试代码。当这个.py文件被引用时,我们希望引用写好的业务逻辑,但不希望执行测试代码。可以把跟这个.py文件相关但跟项目无关的测试代码放到 if __name__ == '__main__': 下面。
包的嵌套
包的嵌套:项目代码组织中,无法直接引用文件夹下的内容。必须通过包来组织。
大型项目中包的嵌套非常普遍,里层的叫子包,如果你想引用文件夹里层的内容,确保各个层级的文件夹都是包。包其实就是指文件夹。
项目根目录顶级包.子包.子子包。如: import L8包.package.pack1(代表层级关系)
引用包时的绝对路径:
绝对路径的好处是准确,缺点写起来麻烦。
引用包时的相对路径问题:
1.引用同级目录
点 . 表示同级目录下的文件或所在的包
2.引用父级目录下的内容
两个 … 表示父级‘目录下’。
(方便理解,点后面的斜杠省略了,后面的包用.来表示层级)
对路径迷惑解决方案:
- 把所有文件夹都变成包
- import from import
- 绝对 从项目根目录下的顶级包开引用
- 相对 从 . … 开始试
- 看pycharm提示
包名命名方法:
中间不要有空格、逗号、句号等特殊符号。不要使用内置关键字,比如print、def、class。不要使用第三方包本身的名字。