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. Atcoder Regular Contest 066 F genocide【JZOJ5451】

    题目 分析 \(s[i]\)表示a前缀和. 设\(f[i]\)表示做完了1~i的友谊颗粒的最优值(不一定选i),那么转移方程为 \[f[i]=max\{f[i-1],max\{f[j]-s[i]+s[ ...

  2. jquery target属性 语法

    jquery target属性 语法 作用:target 属性规定哪个 DOM 元素触发了该事件.大理石平台精度等级 语法:event.targe 参数: 参数 描述 event     必需.规定需 ...

  3. javascript中的原型和原型链(四)

    new运算符工作原理

  4. 【POJ1011】Sticks

    [题目概括] 现在有\(n\)个长度不超过\(50\)的木棍,请你把这些小木棍拼成若干根长度相同的木棍. 请你最小化拼成后的长度. [思路要点] 考虑枚举最后的长度,然后判断是否可以,这样就不需要最优 ...

  5. 前端学习之一_html学习

    html元素分类 内连元素:出现在行内的元素            <img>,<q>,<a> 块元素:前后自动插入换行的元素         <h1> ...

  6. 【学习】mysql 时间戳与日期格式的相互转换

    1.UNIX时间戳转换为日期用函数: FROM_UNIXTIME() ); 输出:2006-08-22 12:11:10 2.日期转换为UNIX时间戳用函数: UNIX_TIMESTAMP() Sel ...

  7. springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版)

    一.引入相应的maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifa ...

  8. golang 使用reflect反射结构体

    "反射结构体"是指在程序执行时,遍历结构体中的字段以及方法. 1.反射结构体 下面使用一个简单的例子说明如何反射结构体. 定义一个结构体,包括3个字段,以及一个方法. 通过refl ...

  9. java的引用传递

    public class T{ static class Node{ int value; Node left = null; Node right = null; public Node(int v ...

  10. VS2017 -error LNK1104: 无法打开文件“msvcprtd.lib”

    原文地址:https://blog.csdn.net/u012308586/article/details/89309495 VS2017 -error LNK1104 无法打开文件“msvcprtd ...