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. Rust学习-阶段1学习总结

    学习Rust已经两周了,基本上是断断续续的在学,或者是在上下班坐公交时,或者是在ODC没事做时.现在已经学习了Rust程序设计语言的前5章,是时候做一个总结了.关于数据类型或者if else这种内容我 ...

  2. linux运维、架构之路-Kubernetes离线集群部署-无坑

    一.部署环境介绍 1.服务器规划 系统 IP地址 主机名 CPU 内存 CentOS  7.5 192.168.56.11 k8s-node1 2C 2G CentOS  7.5 192.168.56 ...

  3. Tomcat配置多个文件夹

    在Tomcat下,conf/server.xml文件下的 Server/Service/Engine/Host节点下,最后添加上以下语句   <Context path="/myweb ...

  4. springboot运行jar包时候加载指定目录的其他jar支持包

    最近发生一个小故障,调试好的项目,发布成jar包后无法找到oracle的驱动,研究了一下解决了.记录一下.写了一个run.sh脚本 #!/bin/bash cd ~ cd app nohup java ...

  5. set总结

    set 定义 列表的特性: 可修改 无序 不重复 列表的创建: ​ 1.直接创建; s = {'a', 1, 'c'} ​ 2.set() 创建一个空set; s = set() ​ 3.set(it ...

  6. [LOJ3106][TJOI2019]唱、跳、rap和篮球:DP+生成函数+NTT+容斥原理

    分析 令\(f(i)\)表示共\(i\)组同学讨论cxk的位置的方案数(不考虑其他位置上的人的爱好),这个数组可以很容易地通过依次考虑每个位置是否是四个人中最后一个人的位置来递推求解,时间复杂度\(O ...

  7. D. Marcin and Training Camp

    D. Marcin and Training Camp 题目链接:http://codeforces.com/contest/1230/problem/D time limit per test: 3 ...

  8. python-Django框架

    常用命令 生成应用 python manage.py start app(app_name) 开启服务器 python manage.py runserver 0.0.0.0:8001 声称以及修改数 ...

  9. C++入门经典-例6.3-字符串之未使用字符串结束符“\0”和使用字符串结束符“\0”的区别

    1:为字符串数组赋值的方式有两种,即数组元素逐一赋值和使用聚合方式赋值. 为数组元素逐一赋值.例如: pWord[0]='H'; 使用聚合方式赋值如: char pWord[]={'H','E','L ...

  10. 20175215 2018-2019-2 第六周java课程学习总结

    第七章 内部类与异常类 1.内部类 Java支持在一个类中定义另一个类,这样的类称作内部类,而包含内部类的类成为内部类的外嵌类 内部类和外嵌类之间重要关系如下 内部类的外嵌类的成员变量在内部类中仍然有 ...