[Python3] 025 包
1. 模块
1.1 模块是什么?
- 模块就是个 Python 文件
- 一个模块就是一个包含 Python 代码的文件
- 后缀名成是 .py 就可以
1.2 为什么用模块?
- 程序太大,编写维护不方便,需要拆分
- 模块可以增加代码重复利用的方式
- 当做命名空间使用,避免命名冲突
1.3 如何定义模块?
- 模块就是一个普通文件,所以任何代码可以直接书写
- 不过根据模块的规范,最好在模块中编写以下内容
- 函数(单一功能)
- 类(相似功能的组合,或者类似业务模块)
- 测试代码
1.4 如何使用模块?
模块直接导入
- 假如模块名称直接以数字开头,需要借助 importlib 帮助
语法
import module_name
module_name.class_name
module_name.function_name
1.4.1 例子1
import module_name
"""
保存为 student.py
包含:
Student 类
sayhello()
print 语句
"""
class Student(object):
def __init__(self, name="NoName", age=18):
self.name = name
self.age = age
def say(self):
print("My name is {0}.".format(self.name))
def say_hello():
print("Hi, this module's name is 'student'.")
if __name__ == "__main__":
print(">>> module Student") # 类似的语句,建议写此处
- 在 student.py 所在的文件夹中新建一个 Python 文件
import student
stu = student.Student("Tom")
stu.say()
print(stu.age)
student.say_hello()
if __name__ == "__main__"的使用- 可以有效避免模块代码被导入的时候被动执行的问题
- 建议以此为程序的入口
1.4.2 例子2
import importlib
"""
保存为 01_student.py
包含:
Student 类
sayhello()
"""
class Student(object):
def __init__(self, name="NoName", age=18):
self.name = name
self.age = age
def say(self):
print("My name is {0}.".format(self.name))
- 在 01_student.py 所在的文件夹中新建一个 Python 文件
- 借助 importlib 包,可以导入以数字开头命名的模块
# import 01_student # SyntaxError: invalid token
import importlib
# 相当于导入了一个叫 01_student 的模块,并将该模块赋值给了 new
new = importlib.import_module("01_student")
stu = new.Student()
stu.say()
1.4.3 例子3
import module_name as new_name
- 导入的同时给模块起一个别名
import student as st
stu = st.Student("Jerry", 17)
stu.say()
print(stu.age)
st.say_hello()
1.4.4 例子4
from module_name import class_name, func_name
- 使用的时候可以直接使用导入的内容,不需要前缀
from student import Student, say_hello
stu = Student("Tom")
stu.say()
print(stu.age)
say_hello()
1.4.5 例子5
from module_name import *
- 导入模块所有内容
from student import *
stu = Student("Tom")
stu.say()
print(stu.age)
say_hello()
2. 模块的搜索路径和存储
2.1 什么是模块的搜索路径?
- 加载模块的时候,系统会在那些地方寻找此模块
- 系统默认的模块搜索路径
import sys
# sys.path 属性可以获取路径列表
print(type(sys.path))
print(sys.path)
for p in sys.path:
print(p)
2.2 如何添加搜索路径?
sys.path.append(dir)
2.3 模块按什么顺序加载?
- 搜索内存中已经加载好的模块
- 搜索 Python 的内置模块
- 搜索 sys.path 路径
3. 包
- 包是一种组织管理代码的方式
- 包里面存放的是模块
- 用于将模块包含在一起的文件夹就是包
3.1 自定义包的结构是怎样的?
|---包
|---|--- __init__.py 包的标志文件
|---|--- 模块1
|---|--- 模块2
|---|--- 子包(子文件夹)
|---|---|--- __init__.py 包的标志文件
|---|---|--- 子包模块1
|---|---|--- 子包模块2
3.2 如何导入包?
3.2.1 例子1
import package_name
直接导入一个包
可以使用
__init__.py中的内容,但__init__.py中一般为空文件结构
|---pkg1
|---|--- __init__.py
|---|---
|---use_pkg1.py
- 示例
# save as __init__.py
def in_init():
print("I am in init of package.")
# save as use_pkg1.py
import pkg1
pkg1.in_init()
3.2.2 例子2
import package_name as new_name
- 简化包名
- 与
import module_name as new用法一致 - 此种方法是默认对
__init__.py内容的导入 - 示例
# save as use_pkg2.py
import pkg1 as p
p.in_init()
3.2.3 例子3
import package_name.module_name
- 文件结构
|---pkg1
|---|--- __init__.py
|---|--- student.py
|---|---
|---use_pkg3.py
- 示例
# save as use_pkg3.py
import pkg1.student
stu = pkg1.student.Student("Tom")
stu.say()
print(stu.age)
pkg1.student.say_hello()
3.2.4 例子4
from package_name import module_name
- 这种导入方法不执行
__init__.py中的内容 - 示例
# save as use_pkg4.py
from pkg1 import student
stu = student.Student("Tom")
stu.say()
print(stu.age)
student.say_hello()
3.2.5 例子5
from package import module1, module2, module3, ...
- 导入包中指定的模块的所有内容
3.2.6 例子6
from package_name import *
- 导入当前包
__init__.py文件中所有的类和函数
3.2.7 例子7
from package_name.module import *
- 导入包中指定模块的所有内容
3.3 _all_
在使用
from package import *的时候,* 可以导入的内容与__all__有关若
__init__.py中没有内容,或没有__all__,则只能导入__init__中的内容若
__init__.py设置了__all__的值,那么按照__all__指定的子包或者模块进行加载,此时不会载入__init__中的其他内容文件结构
|---pkg1
|---|--- __init__.py
|---|--- student.py
|---|---
|---use_pkg.py
- 示例
# save as __init__.py
__all__ = ['module1', 'module2', 'package1', ...]
def in_init():
print("I am in init of package.")
# save as use_pkg.py
from pkg1 import *
stu = student.Student("Tom")
stu.say()
print(stu.age)
student.say_hello()
- 补充
- 在开发中,经常会所以用其他模块,可以在当前包中直接导入其他模块中的内容
- 使用
import 包或者模块的绝对路径
4. 命名空间
- 用于区分不同位置不同功能但相同名称的函数或者变量的一个特定前缀
- 防止命名冲突
setName()
Student.setName()
Teacher.setName()
[Python3] 025 包的更多相关文章
- 【Linux】非root安装Python3及其包管理
1. Python 3.8.1安装 源码安装常规操作: wget -c https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz tar -xv ...
- Python3一些包的下载
首先在windows的Python扩展包网址:http://www.lfd.uci.edu/~gohlke/pythonlibs/ 这里举例下载opencv3.2.0的安装包 我的电脑是win10,6 ...
- python3 导入包总提示no moudle named xxx
一.python中的包有三种 1.python自带的包,如sys, os 2.python的第三方库,如 requests, selenium 3.自己写的.py文件 二.今天主要说下导入自己写的包 ...
- 【笔记】Python3导入包规则
例如:这里给出了一种可能的包结构(在分层的文件系统中): sound/ 顶层包 __init__.py 初始化 sound 包 formats/ 文件格式转换子包 __init__.py wavrea ...
- Python3(五) 包、模块、函数与变量作用域
一.Python项目的组织结构 最顶级的组织结构:包(文件夹) 第二个层级:模块(文件) 第三个层级:类 第四个层级:函数.变量(不属于组织结构,是类本身的特性) 二.Python包与模块的名字 1. ...
- python2 与 python3 依赖包冲突问题
原文链接 https://www.2cto.com/database/201805/749294.html 执行pip的时候取的是/usr/bin这里的pip,查看这里是否存在pip3,没有的话需 ...
- python3 xlrd包的用法
一.xlrd的安装 pip install xlrd 二.xlrd使用介绍 1.导入模块 import xlrd 2.打开Excel文件,实例化为readbook readbook = xlrd.op ...
- PyQt5+Python3.5.2-32bit开发环境搭建
1.基本环境. Window 8.1 64bit Python3.5.2-32bit.exe PyQt5 2.安装python. 去官网下载32位版本的python3.5.2(就是x86那个) 备 ...
- Centos Python2 升级到Python3
1. 从Python官网到获取Python3的包, 切换到目录/usr/local/src #wget https://www.python.org/ftp/python/3.5.1/Python-3 ...
随机推荐
- 使用SQL批量插入数据到数据库 以及一些SQL函数的语法
批量插入100条记录 set nocount on declare @i int=1; while @i<=100 begin Insert into Client(id,ClientCode, ...
- CMD命令行基本命令
基本知识 输入 功能 Alt+Enter 全屏 Ctrl+S 暂停输出 Ctrl+C Ctrl+Break 停止程序 Ctrl+Z 表示输入结束 <file 从文件读标准输入 >file ...
- python起步--windows系统下安装python解释器和PyCharm
参考教程: 1)https://www.runoob.com/w3cnote/pycharm-windows-install.html 2)https://blog.csdn.net/c_shell_ ...
- 【BZOJ5415&UOJ393】归程(Kruskal重构树,最短路)
题意:From https://www.cnblogs.com/Memory-of-winter/p/11628351.html 思路:先从1开始跑一遍dijkstra,建出kruskal重构树之后每 ...
- JS框架_(JQuery.js)夜晚天空满天星星闪烁动画
百度云盘 传送门 密码:xftr 满天星星闪烁动画效果: (可用星空动画来作为页面背景,白色文字改为文章或者其他的O(∩_∩)O) <!doctype html> <html> ...
- [JZOJ6400]:Game(贪心+线段树+二分)
题目描述 小$A$和小$B$在玩一个游戏,他们两个人每人有$n$张牌,每张牌有一个点数,并且在接下来的$n$个回合中每回合他们两人会分别打出手中的一张牌,点数严格更高的一方得一分,然而现在小$A$通过 ...
- Springboot 使用 webSocket
介绍 WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进 ...
- C++入门经典-例4.10-使用static变量实现累加
1:静态变量static可以分为静态局部变量和静态全局变量,静态局部变量的值在函数调用结束后不消失,静态全局变量只能在本源文件中使用. 静态变量属于静态存储方式,它具有以下特点: (1)静态变量在函数 ...
- 套接字之sendmsg系统调用
sendmsg系统调用允许在用户空间构造消息头和控制信息,用此函数可以发送多个数据缓冲区的数据,并支持控制信息:当调用进入内核后,会将用户端的user_msghdr对应拷贝到内核的msghdr中,然后 ...
- python3笔记七:break和continue语句
一:学习内容 break语句 continue语句 二:break语句 1. 说明 作用:跳出for和while的循环注意:只能跳出距离它最近的那一层循环 2.举例1 for i in range(1 ...