[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 ...
随机推荐
- Python 正则表达式Ⅲ
re.match与re.search的区别 re.match只匹配字符串的开始,如果字符串开始https://www.xuanhe.net/不符合正则表达式,则匹配失败,函数返回None:而re.se ...
- Eclipse 导入逆向工程
相关配置 生成 生产前 生成后
- javascript中的原型和原型链(五)
Array.prototype 先记住一句话——每一个函数,都有一个prototype属性——每一个函数,无论是你自定义的,还是系统内置的 var fn = function() {} console ...
- yum安装Docker
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- swift模式和模式匹配
模式和模式匹配 模式: 代表单个或者复合值得结构,也就是说模式不是一个特定的值,它是一种抽象的结构,[一句话,不是特指,是泛指].这样就可以用模式来匹配各种各样的值. 例如:(x,y)可以匹配元祖(1 ...
- 2019Java第十三周课程总结
这周主要是学习了监听器还有制作记事本,主要可以由一下代码来体现 监听器 实验代码 package text12; import java.awt.Container; import java.awt. ...
- 使用layui异步请求上传图片在tp5.1环境下出现“请对上传接口返回json”的错误的解决方法
正常情况下返回json数据使用return json(); 但是使用layui会报错,然后想到了使用json_encode()包装一下用一个变量接收后,再使用return();返回接收json格式的变 ...
- python利器之切片
切片 切片的语法表达式为:[start_index : end_index : step],其中: start_index表示起始索引 end_index表示结束索引 step表示步长,步长不能为0 ...
- Promise 的使用
Promise 的使用,用于异步处理 ,以及解决地狱回调的: 1. Promise 是一个构造函数,既然是构造函数,我们就可以 new Promise() 就可以得到一个 Promise 的实例 2 ...
- Unknown class xxx in Interface Builder file. / NSUnknownKeyException
Error: 2019-11-24 22:16:01.047997+0800 SingleViewDemo[22576:34699748] Unknown class FeedbackCell in ...