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. [傻瓜式一步到位] 阿里云服务器Centos上部署一个Flask项目

    网络上关于flask部署Centos的教程有挺多,不过也很杂乱. 在我第一次将flask上传到centos服务器中遇到了不少问题,也费了挺大的劲. 在参考了一些教程,并综合了几个教程之后才将flask ...

  2. shiro框架学习-6-Shiro内置的Filter过滤器及数据加解密

    1.  shiro的核心过滤器定义在枚举类DefaultFilter 中,一共有11个 ,配置哪个路径对应哪个拦截器进行处理 // // Source code recreated from a .c ...

  3. css grid 随笔

    原文出自Arien的博客https://www.w3cplus.com/css3/line-base-placement-layout.html 首先定义一个网格 1.可以给父容器的display属性 ...

  4. 家谱(gen)x

      家谱(gen) 时间限制  2S [问题描述]     现代的人对于本家族血统越来越感兴趣,现在给出充足的父子关系,请你编写程序找到某个人的最早的祖先. [输入格式]gen.in 输入文件由多行组 ...

  5. sh_09_字典的定义

    sh_09_字典的定义 # 字典是一个无序的数据集合,使用print函数输出字典时,通常 # 输出的顺序和定义的顺序是不一致的! xiaoming = {"name": " ...

  6. ABP core2.2错误笔记,持续更新

    注:以下问题全部基于版本 © 2019 MLCDZ. Version 4.3.0.0 [20190830]  .net core 的版本为2.2 1.System.InvalidOperationEx ...

  7. ar9331修改flash大小和df、cat /proc/mtd的区别

    首先感谢黄工的指导. 在openwrt固件目录下target/linux/ar71xx/image/Makefile,找到对应的机型,修改为4M,8M,16M,32M. 以oolite机型为例,如图所 ...

  8. BZOJ3875--骑士游戏(SPFA处理带后效性的动态规划)

    3875: [Ahoi2014]骑士游戏 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 181  Solved: 91[Submit][Status] ...

  9. AcWing:106. 动态中位数(对顶堆)

    依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数. 输入格式 第一行输入一个整数PP,代表后面数据集的个数,接下来若干行输入各个数据集. 每个数据集的第一行首先 ...

  10. JS框架_(JQuery.js)夜晚天空满天星星闪烁动画

    百度云盘 传送门 密码:xftr 满天星星闪烁动画效果: (可用星空动画来作为页面背景,白色文字改为文章或者其他的O(∩_∩)O) <!doctype html> <html> ...