包
2018-10-21 本文已影响8人
ElfACCC
1、模块
-
一个模块就是一个包含python代码的文件,后缀名市.py就可以
-
为什么我们用模块
- 程序太大,编写维护非常不方便,需要拆分
- 模块可以增加代码重复利用的方式
- 当做命名空间使用,避免命名冲突
-
如何定义模块
- 模块就是一个普通文件,所以任何代码可以直接书写
- 不过根据模块的规范,最好在模块里编写一下内容
- 函数(单一功能)
- 类(相似功能的组合,或者类似业务模块)
- 测试代码
-
如何使用模块
-
模块直接导入
- 加入模块名称直接以数字开头,需要借助importlib帮助
-
语法
import module_name module_name.function_name module_name.class_name
-
案例01,02,p01,p02
-
import 模块 as 别名
-
导入的同事给模块起一个别名
-
其余用法跟第一种相同
-
案例p03
import p01 as p stu = p.student("yueyue",18)
-
-
from module_name import func_name,class_name(用哪个就导入哪个,有选择性导入,不用写前缀了)
-
案例p04
from p01 import student,sayhello stu = student() stu.say() sayhello()
-
from module_name import * (把所有东西都导入,可以不用前缀了但是可能会有命名污染)
-
案例p05
from p01 import * sayhello() stu = student("yueyue",18) stu.say()
-
-
-
有效避免模块代码被导入的时候被动执行的问题
-
建议所有程序的入口都一次代码为入口
if __name__ == '__main__' print("不会在其他模块中执行")
2、模块的搜索路径和存储
-
什么是模块的搜索路径:
-
加载模块的时候,系统会在哪些地方搜索此模块
-
系统默认的模块搜索路径:
import sys sys.path //属性可以获取路径列表
-
添加搜索路径
sys.path.append(dir)//用来添加路径
-
模块的加载顺序
- 1、搜索内容中已经加载好的模块
- 2、搜索python的内置模块比如print
- 3、搜索sys.path路径
3、包
- 包是一种组织管理代码的方式,包里面存放的是模块
- 用于将模块包含在一起的文件夹就是包
- 包的导入操作
- import package_name
-
直接导入一个包,可以使用_init_.py中的内容
-
使用方式是:
package_name.func_name package_name.class_name.func_name()
-
此种方式的访问内容是
-
案例:创建文件夹pkg01,p07.py
-
- import package_name
- import package_name as p
- 具体用法跟作用方式,和上述简单导入一致
- 注意的是此种方式是默认对_init_.py内容的导入
- import package.module
-
导入包中某一个具体的模块
-
使用方法:
package.module.func_name package.module.class.fun() package.module.class.var - 例子: import pkg01.p01 stu = pkg01.p01.Student() stu.say()
-
- import package.module as pm使用方法基本都一样
- from package import module1,module2,......导入方法
-
此种方法不执行'_init_'的内容(可以不用写包名)
from pkg01 import p01 p01.sayhello()
-
- from package import *
-
导入当前包'_init_.py'文件所有的函数和类
-
使用方法:(不用写前缀)
func_name() class_name.func_name() class.name.var
-
- from package.module imort *
-
导入包中指定的模块的所有内容
-
使用方法:
func_name() class_name.func_name()
-
- 在开发环境中经常会用其他模块,可以在当前包中直接导入其他模块中的内容
- import 完整的包或者模块的路径
- '_all_'用法:
- 在使用from package import * 的时候,*可以导入的内容
- '_init.py'中如果文件为空,或者没有'_all',那么只可以把'_init_'中内容导入
- '_init'如果设置了'_all'的值,那么按照其指定的子包或者模块进行(一般包里面'_init'就是空的),一旦定义了'_all',init中其他内容不载入
- '_all_' = [模块1,模块2,包1,……]
4、命名空间
-
用于区分不同位置不同功能但相同名称的函数或者变量的一个指定前缀
-
作用是防止命名冲突
setName()//是当前的 Student.setName()//学生的 Dog.setName()//狗的