[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 ...
随机推荐
- 51 Nod 1066 Bash游戏
1066 Bash游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次最少拿1颗,最多拿K颗,拿到 ...
- 【PKUSC2019】树染色【线段树合并】【树形DP】
Description 给出一棵n个点的树,现在有m种颜色,要给每个节点染色,相邻节点不能同色. 另外有k条限制,形如x号点不能为颜色y 同一节点有可能有多条限制. 求方案数对998244353取模的 ...
- 我不熟悉的list
其实在日常中,链表的题目做的比较多,但是使用STL自带链表的还是比较少,所以里面的一些API不大熟悉.这边也简要介绍一些. 基本的一些API 先列举的这些和上面几篇用法几乎一样,所以不再累述. 赋值相 ...
- 10.Python内置函数一览表
为了提高程序员的开发效率,Python 提供了很多可以直接拿来用的函数(初学者可以先理解为方法),每个函数都可以帮助程序员实现某些具体的功能. 举个例子,在 Python 2.x 中 print 只是 ...
- 把execel表数据导入mysql数据库
今天,是我来公司第二周的第一天. 作为新入职的实习生,目前还没适合我的实质项目工作,今天的学习任务是: 把execel表数据导入到mysql数据库,再练习下java操作JDBC. 先了解下execel ...
- java 从txt文本中随机获取名字
代码: /* 获取随机文件文字 */ public static String random(String path) {//路径 String name = null; try { //把文本文件中 ...
- spring的AOP基本原理
一.什么是AOP AOP(Aspect Oriented Programming),意思是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP基于IoC基础,是对OOP ...
- linux如何查看所有的用户和组信息(转载)
[步骤一]cat /etc/passwdcat /etc/passwd查看所有的用户信息,详情如下图 [步骤二]cat /etc/passwd|grep 用户名 cat /etc/passwd|gre ...
- 【python学习】字符串相关
# -*- coding: utf-8 -*- # ========================================================================== ...
- 三、Linux下mysql的完整安装
参考资料:http://www.cnblogs.com/fly1988happy/archive/2011/11/21/2257682.html http://www.cnblogs.com/xion ...