Python学习基础笔记四十五——包

news2024/11/19 3:28:07

C:\Program Files\Python310\Lib

1、 包的概念:把解决同一类问题的模块放在同一个文件夹里,我们就称为包。

2、在PyCharm中创建一个包:

 文件夹中会有一个init.py文件。

 在Python3中没有这个__init__.py文件也没有问题。

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

import os

os.makedirs('glance/api')    # 在当前目录,创建多级目录
os.makedirs('glance/cmd')
os.makedirs('glance/db')

l = []

l.append(open('glance/__init__.py', 'w'))   # 把文件句柄append到列表中
l.append(open('glance/api/__init__.py', 'w'))
l.append(open('glance/api/policy.py', 'w'))
l.append(open('glance/api/versions.py', 'w'))
l.append(open('glance/cmd/__init__.py', 'w'))
l.append(open('glance/cmd/manage.py', 'w'))
l.append(open('glance/db/__init__.py', 'w'))
l.append(open('glance/db/models.py', 'w'))

map(lambda f: f.close(), l)   # 最后通过map来统一关闭列表里的文件

#文件内容

#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)

 将这些内容分别放到各个文件中。

注意事项:

1)包相关的导入语句也分为import和from...import...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但是都必须遵循这一个原则。

2)对于导入后,在使用时就没有这个限制了,点的左边可以是包、模块、函数、类(它们都可以用点的方法调用自己的属性)。

3)对比import item和from item import name的应用场景:

如果我们想直接使用name,那必须使用后者。

然后,我们在与包glance同级的01homework.py文件中测试:

# 01homework.py
# import语句
# import glance.api.policy
# glance.api.policy.get()

# from...import...
from glance.api import policy
policy.get()

#
from glance.api.policy import get
get()

结果:

需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c,就是错误语法。

我们再看下另外一个问题:

 glance目录是在day2这个目录下面。我们的文件01homework.py文件是跟glance目录是同级的,都是在day2这个目录下面。我们查看sys.path的信息,看到解释器查找目录路径就是直接到day2这个目录中查找,在这个目录中,如果找不到glance目录,那pycharm编辑器将提示出错。

我们也可以通过sys.path.insert()函数将新的查找路径添加到sys.path中去,这样处理也是可以的。

然后我们再看一个文件__init__.py:

不管是哪种方式,只要是第一次导入包或者是包的任何其他部分,都会依次执行包下的__init__.py文件(我们可以在每个包的文件内都打印一行内容来验证一下),这个文件可以为空,但是也可以存放一些初始化包的代码。

单独导入包名的时候,不会导入包中所有包含的所有子模块。

那我们现在直接导入glance包,实现这个功能,就是希望得到glance包中所有模块的功能:

import glance

glance.api.policy.get()   # 那这样,glance包中的各个子目录的文件中的方法就都能使用了

实现这个效果,那我们利用__init__.py文件的特性,需要在glance目录和子目录中的__init__.py文件进行一些处理:

这个是绝对导入:

# glance/__init__.py
from glance import api
from glance import cmd
from glance import db

# glance/api/__init__.py
from glance.api import policy
from glance.api import versions

# glance/cmd/__init__.py
from glance.cmd import manage

# glance/db/__init__.py
from glance.db import models

 然后我们再测试下:

import glance

glance.api.policy.get()
glance.db.models.register_models('mysql')

相对路径:

. 点表示的是当前目录:

.. 两点表示的是上一级目录。

这个是相对导入:

# glance/__init__.py
from . import api
from . import cmd
from . import db

# glance/api/__init__.py
from . import policy
from . import versions

# glance/cmd/__init__.py
from . import manage

# glance/db/__init__.py
from . import models

我们把绝对路径改成了点号,表示当前目录。然后再进行下测试,测试也是正常的。

那我们可以将glance随意移动到别的目录中,只要能找到包的位置,就可以使用包里的模块了。

但是这个时候,我们在这个包里的模块之间调用模块功能就发生错误,因为我们是使用的相对路径,我们在里面的模块又使用了绝对路径,就出现错误。然后我们使用相对路径,只能有..号,相对路径返回上一级。

我们在glance包外边使用就是正常的。

目前,我们这个阶段还没有到制作包的阶段。

我们目前使用这个包,我们正常是使用包里的模块,只要熟悉这个模块的功能即可,正常情况下是不需要到模块中相互调用的。

另外,我们还有*和__all__配合的方式:因为__all__是用于控制from ... import * 的。

注意:在使用pycharm时,有的情况会为你多做一些事情,这是软件相关的东西,会影响你对模块的理解,因而在测试的时候,一定要回到命令行去执行,模拟我们的生产环境。

特别主要注意的是:可以用import导入内置或者第三方模块,但是要绝对避免使用import来导入自定义包的子模块,应该使用from...import...的绝对或者相对导入,且包的相对导入只能用from的形式。

最后有一个软件开发规范:

非web项目的规格:

说明:

1)bin目录下要写一个开始文件,程序入口;

if __name__ == '__main__':
    core.main()

2)core目录,所写的代码都放在这个目录中;

3)conf目录:配置文件,配置文件是给运维人员看的,调一些参数。

4)db目录,userinfo的文件,json文件;

5)lib目录,通用的模块,没有自动安装到python解释器中,这是我们自己写的通用模块;

6)log目录:是我们程序运行的过程,中间执行的每一个结果都显示出来;中间执行结果记录到文件中,有问题去查文件。

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

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

相关文章

Go设计与实现 -- map哈希表

Go语言中的哈希表有它自己的一套实现方式。和Java的哈希表还是有些不同的,但是为了保证知识体系的完整性,我还是准备从头开始说起。 哈希表设计原理 哈希表的读写时间复杂度是O(1),因为它提供了键值之间的映射。要实现一个性能优异的哈希表…

spring——AOP面向切面编程——基于XML的AspectJ AOP开发(转载)

我们可以在 Spring 项目中通过 XML 配置,对切面(Aspect 或 Advisor)、切点(PointCut)以及通知(Advice)进行定义和管理,以实现基于 AspectJ 的 AOP 开发。Spring 提供了基于 XML 的 AOP 支持,并提供了一个名为“aop”的命名空间,该…

Docker笔记--使用Docker部署MySQL

1--Docker部署MySQL ① 搜索MySQL镜像 docker search mysql ② 拉取MySQL镜像 docker pull mysql:latest ③ 创建MySQL容器 首先在宿主机创建MySQL的映射目录,即数据卷: cd /home mkdir mysql cd mysql 之后在当前目录创建MySQL容器($PW…

【事故复盘】吐血整理一场线上事故——CPU飙升200%

🔍 经验使你在第二次犯相同错误时及时发现。 —— 琼斯 🔖 事故时间:12.7日 17:43 ~ 21:03 🔖 事故影响:服务接口查询慢,用户查看数据转圈 🔖 事故过程: 那是一个宛如平静的下午&…

128-150-mysql-高级篇-索引及调优篇

115-mysql-高级篇-索引及调优篇: 索引及调优篇 1、索引的创建与设计原则 1. 索引的声明与使用 1.1 索引的分类 从功能逻辑上说,索引主要有 4 种,分别是普通索引、唯一索引、主键索引、全文索引。按照物理实现方式,索引可以分…

BUUCTF Web1

[极客大挑战 2019]EasySQL 试了个万能密码就能上去了 flag: flag{8e685472-02e4-440a-b04e-b0d9b6d9c27f} [HCTF 2018]WarmUp 看源码有个source.php <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source&qu…

Mysql 创建存储过程和函数及各种例子

Mysql 创建存储过程和函数及各种例子1. Mysql 创建存储过程1.1 前言知识1.1.1 语法结构1.1.2 简单解释1.2 创建存储过程入门例子1.2.1 无参存储过程1.2.1.1 不带变量1.2.1.2 带变量1.2.2 有入参的存储过程1.2.3 有出参的存储过程1.2.4 有入参和存储的存储过程1.2.5 inout的存储…

如何将镜像上传至阿里云?如何从阿里云中拉取自己的镜像?

目录 如何将制作好的镜像上传至阿里云&#xff1f; 一、前期准备 1、注册阿里云账户 2、登录账号 3、配置Docker加速器 4、创建镜像仓库的命名空间&#xff08;私有的&#xff09; 5.创建镜像仓库(创建镜像仓库时要绑定一个代码托管网站&#xff0c;例如&#xff1a;githu…

Zookeeper集群搭建

文章目录前言Zookeeper集群搭建&#xff08;一&#xff09;LeaderFollower模式&#xff08;二&#xff09;下载zookeeeper的压缩包&#xff08;三&#xff09;解压&#xff08;四&#xff09;修改配置文件&#xff08;五&#xff09;添加myid配置&#xff08;六&#xff09;安装…

痞子衡嵌入式:存储器大厂Micron的NOR Flash芯片特殊丝印设计(FBGA代码)

大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家讲的是存储器大厂Micron的NOR Flash芯片特殊丝印设计(FBGA代码)。 痞子衡之前写过一篇文章 《J-Flash在Micron Flash固定区域下载校验失败的故事》&#xff0c;这篇文章里提及了 Micron 家的串行…

明峰医疗IPO终止:亏损超过14亿元,王瑶法、潘华素夫妇为实控人

近日&#xff0c;上海证券交易所科创板披露的信息显示&#xff0c;明峰医疗系统股份有限公司&#xff08;下称“明峰医疗”&#xff09;向上海证券交易所提交了撤回上市申请文件的申请&#xff0c;保荐人海通证券提交了撤回保荐的申请。 因此&#xff0c;上海证券交易所决定终…

设计模式之创建型模式---单例模式

文章目录1.介绍2.应用场景3.实现3.1 结构3.2 类图3.3 代码示例3.3.1 饿汉式3.3.2 懒汉式3.3.3 双重检验锁3.3.3 静态内部类实现单例3.3.4 枚举类实现单例总结1.介绍 单例模式(singleton) 是指某个类中能生成一个实例&#xff0c;该类提供了一个全局访问点&#xff0c;提供一个唯…

JUC并发编程与源码分析笔记07-volatile与JMM

被volatile修饰的变量有两大特点 可见性、有序性&#xff0c;但是不保证原子性。 当写一个volatile变量时&#xff0c;JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中。当读一个volatile变量时&#xff0c;JMM会把该线程对应的本地内存设置为无效&#xff0c;重…

Java开发:汇编语言

一、为什么学习汇编语言 中国人和中国人沟通需要学习汉语 中国人和美国人沟通在会汉语的基础上还要学习英语 那么&#xff0c;人和机器沟通的话需要学习哪些语言呢&#xff1f; 答案是&#xff1a;人类的语言机器语言 但是&#xff0c;机器语言都是由0和1组成&#xff0c;人类…

opencv图像直方图

灰度直方图&#xff1a;从数学上来说&#xff0c;图像直方图是描述图像的各个灰度级的统计特性&#xff0c;它是图像灰度值的函数&#xff0c;统计图像中各个灰度级出现的次数或频率。从图像上来说&#xff0c;灰度直方图是一个二维图像&#xff0c;横坐标为图像中各个像素点的…

git stash命令用法详解(临时存储代码)

1、需求背景 有时候在开发过程中&#xff0c;在一个分支上&#xff08;dev1&#xff09;已经写了一部分代码&#xff0c;但是需要紧急切换到别的分支(dev2)上修改某个代码&#xff0c;这时候不能直接从dev1分支上切换到dev2分支上&#xff0c;提示你需要保存代码。此时dev1分支…

Linux内存模型

sparse内存模型前言1.SPARSEMEM原理:2.vmemmap在虚拟地址空间位置3.virt&#xff0c;phys&#xff0c;page&#xff0c;pfn之间的转换关系3.1内核态虚拟地址和物理内存地址转换关系3.2页帧pfn、物理内存的page指针的关系3.3其他快捷的转换总结前言 Linux中的物理内存被按页框划…

408 考研《操作系统》第二章第五节:信号量机制和用信号量机制实现进程互斥、同步、前驱关系

文章目录教程1. 信号量机制1.1 概念1.2 信号量机制——整型信号量1.3 信号量机制——记录型信号量&#xff08;important&#xff09;1.4 总结2. 用信号量机制实现进程互斥、同步、前驱关系2.1 信号量机制实现进程互斥&#xff08;important&#xff09;2.2 信号量机制实现进程…

java基于SpringBoot的在线答疑系统的研究与实现-计算机毕业设计

项目介绍 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大师生的喜爱&#xff0c;也逐渐进入了每个学生的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c;构建符合…

【matplotlib】2-使用统计函数绘制简单图形

文章目录使用统计函数绘制简单图形1.函数bar()--用于绘制柱状图2.函数barh()--用于绘制条形图3.函数hist()--用于绘制条形图4.函数pie()--用于绘制饼图5.函数polar()--用于绘制极线图6.函数scatter()--用于绘制气泡图7.函数stem()--用于绘制棉棒图8.函数boxplot()--用于绘制箱线…