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 模块按什么顺序加载?

  1. 搜索内存中已经加载好的模块
  2. 搜索 Python 的内置模块
  3. 搜索 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 包的更多相关文章

  1. 【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 ...

  2. Python3一些包的下载

    首先在windows的Python扩展包网址:http://www.lfd.uci.edu/~gohlke/pythonlibs/ 这里举例下载opencv3.2.0的安装包 我的电脑是win10,6 ...

  3. python3 导入包总提示no moudle named xxx

    一.python中的包有三种 1.python自带的包,如sys, os 2.python的第三方库,如 requests, selenium 3.自己写的.py文件 二.今天主要说下导入自己写的包 ...

  4. 【笔记】Python3导入包规则

    例如:这里给出了一种可能的包结构(在分层的文件系统中): sound/ 顶层包 __init__.py 初始化 sound 包 formats/ 文件格式转换子包 __init__.py wavrea ...

  5. Python3(五) 包、模块、函数与变量作用域

    一.Python项目的组织结构 最顶级的组织结构:包(文件夹) 第二个层级:模块(文件) 第三个层级:类 第四个层级:函数.变量(不属于组织结构,是类本身的特性) 二.Python包与模块的名字 1. ...

  6. python2 与 python3 依赖包冲突问题

    原文链接   https://www.2cto.com/database/201805/749294.html 执行pip的时候取的是/usr/bin这里的pip,查看这里是否存在pip3,没有的话需 ...

  7. python3 xlrd包的用法

    一.xlrd的安装 pip install xlrd 二.xlrd使用介绍 1.导入模块 import xlrd 2.打开Excel文件,实例化为readbook readbook = xlrd.op ...

  8. PyQt5+Python3.5.2-32bit开发环境搭建

      1.基本环境. Window 8.1 64bit Python3.5.2-32bit.exe PyQt5 2.安装python. 去官网下载32位版本的python3.5.2(就是x86那个) 备 ...

  9. Centos Python2 升级到Python3

    1. 从Python官网到获取Python3的包, 切换到目录/usr/local/src #wget https://www.python.org/ftp/python/3.5.1/Python-3 ...

随机推荐

  1. (转载)Ant自动编译打包android项目

    1  Ant自动编译打包android项目 1.1   Ant安装 ant的安装比较简单,下载ant压缩包  http://ant.apache.org  (最新的为1.9.3版本),下载之后将其解压 ...

  2. 对abel 转译 class 过程的研究----------------------引用

    作为当下最流行的 JavaScript 编译器,Babel 替我们转译 ECMAScript 语法,而我们不用再担心如何进行向后兼容. 零.前言 虽然在 JavaScript 中对象无处不在,但这门语 ...

  3. Eclipse快捷键和IDEA对比

  4. Git 下拉项目

    1.[VCS]> [Checkout  from  Version  Control] >  [Git] 2.项目Git路径 > [Clone]

  5. CF293E Close Vertices 点分治+树状数组

    开始zz写了一个主席树,后来发现写个树状数组就行~ #include <cstdio> #include <vector> #include <algorithm> ...

  6. LOJ #2718. 「NOI2018」归程 Dijkstra+可持久化并查集

    把 $Noi2018$ day1t1 想出来还是挺开心的,虽然是一道水题~ 预处理出来 1 号点到其它点的最短路,然后预处理边权从大到小排序后加入前 $i$ 个边的并查集. 这个并查集用可持久化线段树 ...

  7. java 获取文本一行一行读

    直接上代码: 如果出现乱码:请改一下编码:我这里使用utf-8是会乱码的,改GBK就好了 // 读取文件内容 public static String readFile(String path) {/ ...

  8. CyclicBarrier源码阅读

    一种允许多个线程全部等待彼此都到达某个屏障的同步机制 使用 多个线程并发执行同一个CyclicBarrier实例的await方法时,每个线程执行这个方法后,都会被暂停,只有当最后一个线程执行完awai ...

  9. shiro所需的依赖

    <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring< ...

  10. js函数收集

    常见js函数收集: 转自:http://www.qdfuns.com/notes/36030/2eb2d45cccd4e62020b0a6f0586390af.html //运动框架 function ...