python中包的语法
1.什么是包?
包是一种通过".模块名"来组织python模块名称空间的方式.我们穿件的每个文件夹都可以被称为包.
但是要注意, 在python2中规定. 包内必须存在__init__.py文件.
创建包的目的不是为了运行, 而是被导入使用. 包只是一种形式而已,包的本质就是一种模块.
2.包的作用?
包的本质就是一个文件夹,那么文件夹唯一的功能就是将文件组织起来,随着功能越写越多,我们无法将
所有功能都放在一个文件夹中,于是我们使用模块去组织功能,随着模块越来越多,我们就需要用文件夹将
模块文件组织起来,以此来提高程序的结构性和可维护性.
接下来创建一些包用来后面的学习.包很好创建,只需要一个文件夹,有__init__.py就可以了.
import os
os.makedirs('glance/api')
os.makedirs('glance/cmd')
os.makedirs('glance/db')
l = []
l.append(open('glance/__init__.py','w'))
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)
创建好目录结构
我们给每个文件夹中添加一些方法:
#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)
我们在test.py中就可以使用包中的内容, 并且,我们导入包的时候可以使用import或者from xxx import xxx的形式
import glance.db.models
glance.db.models.register_models('mysql') from glance.api.policy import get
get()
但是,注意:from xxx import xxx这种形式, import后⾯不可以出现"点" 也 就是说from a.b import c是ok的.
但是 from a import b.c 是错误的
3.__init__.py是干什么的?
不论我们使用哪种方式导入一个包, 只要是第一次导入包或者是包的任何其他部分, 都会先执行__init__.py文件.
这个文件可以是空的, 但是也可以存放一些初始化的代码.
那么我们之前用的from xxx import * 能用在包的调用上吗?
可以,我们要在__init__.py文件中给出__all__来确定*导入的内容.
print("我是glance的__init__.py⽂件. ")
x = 10
def hehe():
print("我是呵呵") def haha():
print("我是哈哈")
__all__ = ['x', "hehe"]
test.py
from glance import * print(x) # OK
hehe() # OK
haha() # 报错. __all__⾥没有这个⻤东⻄
4.相对导入和绝对导入
我们的最定级包glance是写给别人用的,然后在glance包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种导入方式.
1).绝对导入:一glance作为起始
2). 相对导入: 用 . 或者 .. 作为起始
例如, 我们在glance/api/version.py中使⽤glance/cmd/manage.py
# 在glance/api/version.py #绝对导⼊
from glance.cmd import manage
manage.main() #相对导⼊
# 这种情形不可以在versions中启动程序.
# attempted relative import beyond top-level package
from ..cmd import manage
manage.main()
我们在测试的时候要注意,python包路径跟运行脚本所在的目录有关系.
在python中不允许你运行的程序导报的时候超过当前包的范围(相对导入).
如果使用绝对导入.没有这个问题.即,如果你在包内使用了相对导入.那在使用该包内信息的时候.只能在包外面导入
# 在policy.py
import versions
如果我们程序的入口时policy,那此时程序是没有任何问题的.但是如果我们在glance外面import了glance中的policy就会报错.
原因是如果在外面访问policy的时候.sys.path中的路径就是外面.所以根本就不能直接找到versions模块.所以一定会报错:
ModuleNotFoundError: No module named 'versions'
当我们导包出错的时候,一定要先看sys.path.看一下是否真的能获取到包的信息.
5.单独导入一个包
# 在test.py中
import glance
此时导入的glance什么做不了.因为在glance中的__init__.py中并没有关于子包的加载.此时我们需要在__init__.py中分别去引入子包中的内容.
1.使用相对路径
2.使用绝对路径
包的注意事项:
关于包相关的导入语句也分别为import和from xxx import xxx两种, 但无论使用哪种,无论在什么位置,在导入时都必须遵循一个原则: 凡是在导入时带点的,
点的左边都必须是一个包. 否则报错. 可以带一连串的点. 比如: from a.b.c import d
python中包的语法的更多相关文章
- 全面了解Python中的特殊语法:filter、map、reduce、lambda。
这篇文章主要介绍了Python中的特殊语法:filter.map.reduce.lambda介绍,本文分别对这个特殊语法给出了代码实例,需要的朋友可以参考下filter(function, seque ...
- Python 中包/模块的 `import` 操作
版权声明:博客为作者原创,允许转载,但必须注明原文地址: https://www.cnblogs.com/byronxie/p/10745292.html 用实例来说明 import 的作用吧. 创建 ...
- Python中的基本语法
#Python的基本语法: #1.了解缩进 #Python中没有{}来表示一个代码块,但是Python使用缩进来完成区别代码框架 #那么在Python中一个缩进一般等于4个空格,当然你也可以使用TAB ...
- Python中包(package)的调用方式
一.什么是Python Package 如何区分你看到的目录是一个Python Package包呢?其实很简单,你只要看这个名录下是否有“__init__.py”这个文件就好了,如果有那么就是Pyt ...
- python中包和模块的使用说明
python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用. 如果想 ...
- Python中的赋值语法
Python中复制语法有6种 Basic Form >>>spam = 'spam' Tuple assignment >>>spam, ham = 'spam', ...
- Python 中 PyQt5 库语法(一)
目录 PyQt5库(一) 一. 简介 1. 什么是 Qt 2. 什么是PyQt 3. 环境搭建 二. 基本结构 1. 第一个程序 2. 控件操作 3. 快速生成代码 4. 面向对象 三. 基类控件 1 ...
- 查看python中包的文档
核心命令:python -m pydoc 查询某包:python -m pydoc 包名 示例: C:\Users\xxx>python -m pydoc pydoc - the Python ...
- Python中Swithch Case语法实现
而python本身没有switch语句,解决方法有以下3种:A.使用dictionaryvalues = { value1: do_some_stuff1, value2: do_some_stuff ...
随机推荐
- JVM探秘3---垃圾回收机制详解
众所周知,Java有自己的垃圾回收机制,它可以有效的释放系统资源,提高系统的运行效率.那么它是怎么运行的呢,这次就来详细解析下Java的垃圾回收 1.什么是垃圾? 垃圾回收回收的自然是垃圾,那么jav ...
- 20165316 预备作业3 Linux安装及学习
Linux安装 我下载的是VirtualBox 5.2.6和Ubuntu 17.10.1,感觉这两个版本的兼容性不是太好,因为我在Oracle的官网社区中看到不少新版本的问题没有得到解决,而老版本(V ...
- 实用的 图片上传 html+css
html <form id="mainForm"> <div class="content"> <div class=" ...
- 【linux应用】将一个大文件按行拆分成小文件
例如将一个BLM.txt文件分成前缀为 BLM_ 的1000个小文件,后缀为系数形式,且后缀为4位数字形式 先利用 wc -l BLM.txt #读出BLM.txt有多少行. 再利用 split 命令 ...
- sql 思路
先 django 定好sql框架 再 sqlalchemy 根据框架写...
- Linux学习笔记之CentOS7配置***SS
0x00 概述 最近安装K8S,镜像在国内不可达,只能通过科学方法获取. 0x01 安装配置Shadowsocks客户端 1.1 安装Sha.dows.ocks客户端 安装epel扩展源 采用Pyth ...
- Mysql 存储过程中使用多游标
Mysql 存储过程中使用多游标 drop procedure IF EXISTS test_proc_1; create procedure test_proc_1() begin ; ) ; ) ...
- Spring Boot(二十):使用spring-boot-admin对spring-boot服务进行监控
Spring Boot(二十):使用spring-boot-admin对spring-boot服务进行监控 Spring Boot Actuator提供了对单个Spring Boot的监控,信息包含: ...
- Linux - TCP编程相关配置1
100万并发连接服务器笔记之1M并发连接目标达成 第四个遇到的问题:tcp_mem 在服务端,连接达到一定数量,诸如50W时,有些隐藏很深的问题,就不断的抛出来. 通过查看dmesg命令查看,发现大量 ...
- JavaScript中冒泡与事件委托
冒泡 事件触发后事件流的三个阶段按顺序依次是: 1.捕获阶段 2.目标阶段 3.冒泡阶段 大盒子包裹小盒子,两个盒子都分别添加点击事件,当点击小盒子,两个盒子的事件都会触发. 事件委托 下级元素委托上 ...