当前位置: 首页 > news >正文

Python从入门到实践:包的使用

随着模块数目的增多,把所有模块不加区分地放到一起也是极不合理的,于是Python为我们提供了一种把模块组织到一起的方法,即创建一个包。包就是一个含有_init_.py文件的文件夹,文件夹内可以组织子模块或子包,例如

我们直接举一个例子:

这是文件的结构:saaa包中有两个包,foo、foo2,里面m1.py和m2都是一样的

 我们先明白一点:执行什么文件,就以该文件的执行寻顺序,寻址方式是一样的,比如,我要执行test.py,我看一下他的执行顺序(环境变量是以执行文件为基准的,所有被导入的模块或者说后续的其他文件引用的sys.path都是参照执行文件的sys.path

在foo和foo2中的文件的执行顺序也是按照这个,我们看一下两个文件的两种定义:

 

 

 

 

1.关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如import 顶级包.子包.子模块,但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)
 
2、包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间
 
3、import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件

注意:

还可以借助模块提供的__all__ 变量,该变量的值是一个列表,存储的是当前模块中一些成员(变量、函数或者类)的名称。通过在模块文件中设置__all__变量,当其它文件以“from 模块名 import *”的形式导入该模块时,该文件中只能使用__all__ 列表中指定的成员。(__all__智只会限制*,如果以其他形式导入,不会限制)__all__也是对于模块公开接口的一种约定,比起下划线,__all__提供了暴露接口用的“白名单”。

# mytest.py
__all__ = ['a','b']  #这里不同

def a():
    print('aaaaa')
def b():
    print('bbbbb') 
def c():                  # 这里不同
    print('ccccc')
    
# mytest2.py
from mytest import *
a()
b()
c()

 

Traceback (most recent call last):
  File "/home/mytest2.py", line 6, in <module>
    c()
NameError: name 'c' is not defined
aaaaa
bbbbb

相关文章:

  • kubernetes二进制安装教程单master
  • LeetCode-998. 最大二叉树 II【最大二叉树】
  • 如何快速使用proteus【硬件课程设计】
  • 从零开始手写一个Transformer
  • java基于springboot+Vue图片分享社区网站
  • Appium环境搭建及元素定位
  • 神经网络算法处理器设计,神经网络是机器算法吗
  • 爱上开源之golang入门至实战第四章函数(Func)(九)
  • Ubuntu安装可视化界面ElasticSearch-head插件
  • 【数论:组合数学】排列组合
  • kickstarter/indiegogo海外众筹六大核心
  • 做库存功能业务场景详解,S2B2B系统助力建筑建材企业精准掌握库存动态
  • 操作系统——内存管理例题
  • 自动化测试框架Pytest(九)——任务管理
  • java计算机毕业设计贵州省高考本科志愿填报指导系统源码+数据库+系统+lw文档+mybatis+运行部署
  • @angular/forms 源码解析之双向绑定
  • 【css3】浏览器内核及其兼容性
  • CentOS从零开始部署Nodejs项目
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • js正则,这点儿就够用了
  • PHP 的 SAPI 是个什么东西
  • PHP那些事儿
  • rc-form之最单纯情况
  • Redux 中间件分析
  • swift基础之_对象 实例方法 对象方法。
  • Travix是如何部署应用程序到Kubernetes上的
  • Yii源码解读-服务定位器(Service Locator)
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 给初学者:JavaScript 中数组操作注意点
  • 无服务器化是企业 IT 架构的未来吗?
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 正则学习笔记
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (5)STL算法之复制
  • (8)STL算法之替换
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • .md即markdown文件的基本常用编写语法
  • .net core Swagger 过滤部分Api
  • .NET Core 版本不支持的问题
  • .NET Core 中的路径问题
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .Net转前端开发-启航篇,如何定制博客园主题
  • .project文件
  • /var/log/cvslog 太大
  • @Autowired标签与 @Resource标签 的区别