Python之模块与包(下)

1、什么是包

#官网解释

Packages are a way of structuring Python’s module namespace by using “dotted module names”

包是一种通过使用‘.模块名’来组织python模块名称空间的方式。

#具体的:包就是一个包含有__init__.py文件的文件夹,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来

#需要强调的是:

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

  2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包的本质就是一种模块

2、为何要使用包

包的本质就是一个文件夹,那么文件夹唯一的功能就是将文件组织起来

随着功能越写越多,我们无法将所以功能都放到一个文件中,于是我们使用模块去组织功能,而随着模块越来越多,我们就需要用文件夹将模块文件组织起来,以此来提高程序的结构性和可维护性

3、注意事项

#1、关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。

例:import spam.x

导入前:import spam.x:如果 spam 是一个模块,就会报错,spam 必须是一个包

导入后:spam.x 直接调用模块 spam 下的 x 属性

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

调用包就是执行包下的__init__.py文件

#3、包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间

 

4、例子

例1:

glance/                   #Top-level package  大包

├── __init__.py      #Initialize the glance package

├── api                  #Subpackage for api  小包

│   ├── __init__.py│   ├── policy.py│   └── versions.py├── cmd                #Subpackage for cmd 小包

│   ├── __init__.py│   └── manage.py└── db                  #Subpackage for db 小包
├── __init__.py└── models.py
目录结构
#policy.py
def get():print('from policy.py')#versions.py
def create_resource(conf):print('from version.py: ',conf)#manage.py
def main():print('from manage.py')#models.py
def register_models(engine):print('from models.py: ',engine)包所包含的文件内容
文件内容
from . import api
# 告诉调用 glance 包的模块,找api 的话从你自己的 sys.path 下 glance 下开始找 api
glance包 __init__ 的文件内容
# print('from api init.py')
# __all__=['x','y','policy']   # all 方法对应 
# x=1
# y=2
from . import policy
# 告诉那个导入 api包的模块(test),找 policy 的时候,从他自己的 sys.path 开始找
# import policy# 绝对导入
# 告诉那个导入 api包的模块(test),找 policy 的时候,从他自己的 sys.path 下的 glance.api 开始找
# from glance.api import policy# 相对导入
# 从当前目录开始找 policy 模块
# from . import policy# 帮 test 找到 manage 模块
# from ..cmd import manage# 直接运行此文件会报错,
# SystemError: Parent module '' not loaded, cannot perform relative import
# 父模块没有被加载,不能使用相对导入的意思
# 说明包里面的模块不应该作为单独文件直接运行
api包 __init__ 的文件内容
# 例1:直接 import 包方式导入模块
# import glance.api.policy  # 导入 blance包下的api包下的policy模块
# glance.api.policy.get()   # 执行 policy下的 get 方法# 例2:比较直观的用法
# from glance.api import policy  # from 大包.小包 import 模块
# policy.get()# from glance.api import policy.get  # 不能这样用,报 SyntaxError: invalid syntax 语法错误
# get()# from glance import api.policy
# 虽然满足点左边的是包,但是这里是 from ... import,import后面必须明确一个不能带点的东西#需要注意的是from后import导入的模块,必须是明确的一个不能带点东西,否则会有语法错误
# 如:from a import b.c 是错误语法# api 的 init 文件
# from glance.api import policy
# 当导入包的时候,只会执行 api 包下面的 init 文件
# policy.get()# * 的意义
# from glance.api import *
# 导入包,依然会执行 init 文件,但是这里的 * 不代表 api 包下所有的模块
# * 是指 api 下 init 里面 __all__ 里面包含的属性,属性可以是任何,模块,变量等等
# import glance.api # 导入包就执行 glance 和 api 包 init 文件
# print(glance.api.policy)
# 但是 policy 依然没有,因为这里只是导入包,执行 init,不会触发 all 方法# import glance.api  # 触发 api 下的 init 文件
# print(glance.api.policy)  # ImportError: No module named 'policy'
# init 下有 import policy
# 先从内存里找 policy,然后从内建里找,最后从当前 test 所在的 sys.path 里找 policy 模块,找不到,报错# 让 api 包帮我找到 manage 模块
# glance.api.manage.main()import glance
glance.api.policy.get()# 如果是导入跟“包”同级的aaa包下的 glacne,就要先找到两者的父级目录,再从父级目录开始找
import os
import sys
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print(base_dir) # 父级目录
sys.path.append(base_dir)
from aaa.glance.api import policy
policy.get()
跟 glance 同级的文件 test.py

 

例2:

if __name__=='__main__': # 表示把自己当做脚本去用print('ok')

如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == '__main__'“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字,而不是__main__。

这个功能还有一个用处:调试代码的时候,在”if __name__ == '__main__'“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!

logger.py
def logging():print('ok')mian.py
from core import logger
def main():logger.logging()# print(__name__)
if __name__ == '__main__':main()bin.py
import os,sys
base_dir=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # 添加ATM的绝对路径
# print(base_dir)
sys.path.append(base_dir)  # 把路径添加到系统环境变量里去from core import main
main.main()
例子

现象:

1、当执行 bin.py 的时候会显示 ok,正常运行,单独执行 main.py 正常显示一个 ok

2、当 main.py 注释 if __name__ == '__main__',执行 bin.py 会显示两个 ok,单独执行 main.py 正常显示一个 ok

3、当 main.py 只有 print(__name__),执行 bin.py 只显示 main,执行 main.py 显示 __main__

结论:

1:if __name__ == '__main__' 是用来调试用的,在别的地方调用该模块执行的使用不会执行被调用模块下的 if __name__ == '__main__' 下的代码

2:在被调用模块下执行程序,会执行 if __name__ == '__main__' 下的代码,因为是自己的地方,方便调试

 

5、包的2种调用方式

clip_image001

logger.py 文件内容

def logger():print('logger')

# from web.web2 import logger # 二层目录

调用 logger 模块里的 logger方法

logger.logger()

# from web.web2.logger import logger # 调用 web包下的 web2包下的logger 模块的 logger 方法,直接用 Logger()

直接调用 logger 模块里的 logger方法

logger()

.

转载于:https://www.cnblogs.com/tootooman/p/9071402.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接口测试学习——操作MySQL

第一步要导入第三方的jar包。(jemeter不能直接连接MySQL) 操作方法就是点击“测试计划”,右侧展开的页面中选择【浏览】,选择MySQL的jar包。导入即可。 第二步:创建数据库链接的配置:MySQL的路径URL、端口号…

html5网页自动滚动,Html5 滚动穿透的方法

问题背景:网站需要在移动端完成适配,针对移动端H5以及web端采用的都是bluma这种flex布局解决方案在H5中使用的列表采用的是 react-virtualized 来绘制表格为了展示表格中单行数据的具体详情,通常的解决方案是采用新页面或者是弹窗来完成。这里采用的是弹…

mac如何看html5视频播放器,苹果Mac系统看HTML5视频教程介绍

上一回,小编教了大家一个Mac用 HTML5 免费看优酷和土豆等付费视频,这回小编又找到一个用HTML5看视频的好方法,很多很好用的资源,你可以在Mac上看各种地方台的直播以及乐视、凤凰卫视、TVB、东森等港澳台电视节目哦!大部…

html中设置负边距的意义,css负边距之详解

自从1998年CSS2作为推荐以来,表格的使用渐渐退去,成为历史。正因为此,从那以后CSS布局成为了优雅代码的代名词。对于所有设计师使用过的CSS概念,负边距作为最少讨论到的定位方式要记上一功。这就像是在线纹身-每个人都会做&#x…

warning: expression result unuesd 可能原因是函数忘了加括号,

转载于:https://www.cnblogs.com/chulin/p/9082833.html

vue基础18(vue-cli脚手架项目中组件的使用)

vue-cli脚手架项目中组件的使用 在webpack-simple模板中,包括webpck模板。一个.vue文件就是一个组件。 为什么会这样呢?因为webpack干活了!webpack的将我们所有的资源文件进行打包。同时webpack还能将我们的html(template&#xf…

js和layerjs配合实现的拖拽表格列

前几天想着实现表格列的拖拽 写了个例子 一直不完美 经过修改感觉还算完美了 拖拽过程不会复制文字并且还能实现layerjs本身自带的表格排序功能。 1、首先引入layer.css jquery layui.all.js 2、布局页面 <div class"divT"> <table class"l…

计算机应用中的CAI,????按计算机应用的分类,CAI应属于()应用。

按计常见的企业法律组织形式有()&#xff1f;算机属于recoil固有的、应用I应应用本来的按计cant help but算机属于Destruction of the original forest leads to the ___ of many plants.应用I应应用flocks of的同义词按计Many birds ___ southeast in winter.支持、算机属于供…

(tmp 8) 0xff;

以下是阅读他人文章后&#xff0c;个人对计算 (tmp >> 8) & 0xff; 的理解&#xff1a; 将tmp转为二进制数 6322040->11000000111011101111000,向右移16位&#xff08;清掉该16位&#xff09;&#xff0c;且左边用0补足16位 00000000000000001100000&#xff0c;将…

请对比html与css的异同,css3与css2的区别是什么?

CSS为HTML标记语言提供了一种样式描述&#xff0c;定义了其中元素的显示方式。CSS在Web设计领域是一个突破。利用它可以实现修改一个小的样式更新与之相关的所有页面元素。CSS2.0是一套全新的样式表结构&#xff0c;是由W3C推行的&#xff0c;同以往的CSS1.0或CSS1.2完全不一样…

MySQL数据导入导出(一)

今天遇到一个需求&#xff0c;要用自动任务将一张表的数据导入另一张表。具体场景及限制&#xff1a;将数据库A中表A的数据导入到数据库B的表B中&#xff08;增量数据或全量数据两种方式&#xff09;&#xff1b;体系1和体系2只能分别访问数据库A和数据库B。附图&#xff1a; 实…

360桌面计算机,360桌面管理软件

360桌面管理是从360安全卫士中单独提取出来&#xff0c;让你无需安装360安全卫士就能快速使用桌面助手整理自己的桌面。【功能特色】1、一键整理桌面&#xff0c;眨眼之间变清爽360桌面助手采用收纳盒进行分类管理&#xff0c;支持一键整理电脑桌面&#xff0c;用户只要点击“桌…

基于51的串行通讯原理及协议详解(uart)

串行与并行通讯方式 并行&#xff1a;控制简单&#xff0c;传输速度快。线多&#xff0c;长距离成本较高且同时接受困难。 串行&#xff1a;将数据字节分成一位一位的行驶在一条传输线上进行传输。如图&#xff1a; 同步与异步串行通讯方式 同步串行通讯方式&#xff1a;同步…

计算机四级考试题数据库,计算机四级考试《数据库系统工程师》试题及答案

计算机四级考试《数据库系统工程师》试题及答案计算机四级备考工作正在火热进行中&#xff0c;为帮助考生们更好地复习备考&#xff0c;以下是百分网小编搜索整理的一份计算机四级考试《数据库系统工程师》试题及答案&#xff0c;供参考练习&#xff0c;预祝考生们考出自己理想…

二层环路保护,RRPP多环的配置

作者:邓聪聪 组网需求&#xff1a; 局域网中&#xff0c;由A/B/C/D构成RRPP域1换网络结构&#xff0c;要求环网机构中的任意两条线路中断都不能影响业务。 配置思路&#xff1a; 环路由两部分组成&#xff0c;ring1、ring2&#xff0c;B为环1的主节点&#xff0c;G0/0/2为主端口…

如图所示是一种轧钢计算机控制系统,高速线材厂轧钢工艺培训(活套)

原标题&#xff1a;高速线材厂轧钢工艺培训(活套)活套现代高速线材轧机为保证产品尺寸精度&#xff0c;采用微张力及无张力轧制&#xff0c;以消除轧制过程中各种动态干扰引起的张力波动和由此引起的轧件尺寸波动。由于精轧机组为集体传动&#xff0c;故精轧采用微张力轧制&…

Linux服务部署之NTP时间服务器

Linux服务部署之NTP时间服务器&#xff1a; 服务器端IP&#xff1a;192.168.11.119 client端Ip&#xff1a; 192.168.11.101 先安装服务器端ntp: 首先先查看是否安装了ntp时间服务器; ~]# rpm -q ntp >查看是否安装了ntp服务器&#xff1b; 如果没有&#xff0c;安装服务器…

Dubbo架构设计详解

Dubbo是Alibaba开源的分布式服务框架&#xff0c;它最大的特点是按照分层的方式来架构&#xff0c;使用这种方式可以使各个层之间解耦合&#xff08;或者最大限度地松耦合&#xff09;。从服务模型的角度来看&#xff0c;Dubbo采用的是一种非常简单的模型&#xff0c;要么是提供…

new 3ds右摇杆测试软件,电击杂志编辑新3DS评测:防抖3D效果拔群!

电击杂志日前在本周杂志上看在了10月11日任天堂将会发售新型3DS主机“新3DS”与“新3DS LL”的上手报告。究竟新版3DS表现如何&#xff1f;让我们一窥究竟。新3DS与新3DS LL“新3DS”与“新3DS LL”是于8月29日配信的“任天堂8月29日3DS直面会”中发表的&#xff0c;主要特点是…

计算机cad比例尺1 150,CAD图纸里面 1:50 和:1:100和1:150三个比例分别怎么换算...

CAD图纸里面 1&#xff1a;50 和&#xff1a;1&#xff1a;100和1&#xff1a;150三个比例分别怎么换算以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;CAD图纸里面 1&#xff1a;50 和&…