模块
- 一个模块就是一个包含Python代码的文件,后缀名为.py。
- 模块
- 程序太大,编写维护非常不方便,需要拆分
- 模块可以增加模块的复用
- 当做命名空间使用,避免命名冲突
- 模块的定义
- 模块就是普通文件,任何代码都可以直接写
- 根据模块的规范,最好在模块中编写以下内容
- 函数(单一功能)
- 类(相似功能的组合,或者类似的业务模块)
- 测试代码
- 如何使用模块
- 直接导入
- 语法
import module_name module_name.function_name module_name.class_name
- import 模块 as 别名 (之后导入时只需要使用别名即可)
- from module_name import func_name,class_name (不将整个模块导入,用到模块哪些函数等导入哪些)
- 按上述有选择性导入
- 在使用时可以直接使用导入内容,不需要前缀
- import module_name import *
- 导入模块所有内容
- 'if name == "main" '的使用
- 可以有效地模块代码被导入时被动执行问题
- 建议所有程序的如口都以此代码为入口
In [7]:
#下列代码假设保存文件名为p01.py
#一个人学生类
class Student():
def __init__(self,name='Noname',age=18):
self.name = name
self.age = age
def say(self):
print('My name is {0},I am {1}'.forrmat(self.name,self.age))
def sayHello():
print('Welcome to Wuzhi !')
print('我是模块')
我是模块
In [13]:
#当模块引用时
'''
import p01 #文件名
stu = p01.Student('goudan',18)
stu.say()
p01.sayHello()
'''
#上述模块引用代码与下述代码意义一致
class Student():
def __init__(self,name='Noname',age=18):
self.name = name
self.age = age
def say(self):
print('My name is {0},I am {1}'.format(self.name,self.age))
def sayHello():
print('Welcome to Wuzhi !')
if __name__ == '__main__':#使得下列输出语句在模块被导入时不运行,模块自身运行时运行
print('我是模块')
stu =Student('goudan',18)
stu.say()
sayHello()
我是模块 My name is goudan,I am 18 Welcome to Wuzhi !
In [12]:
'''
#当模块文件命名为数字开头时,模块的引用需要借助importlib包
import importlib
#相当于导入一个叫01的模块,并把他赋值给haha
haha = importlib.import_module('01')
# 在之后引用函数等时 将 01 变为 haha 即可
stu = haha.Student()
stu.say()
'''
Out[12]:
"\n#当模块文件命名为数字开头时,模块的引用需要借助importlib包\nimport importlib\n#相当于导入一个叫01的模块,并把他赋值给haha\nhaha = importlib.import_module('01')\n# 在之后引用函数等时 将 01 变为 haha 即可\nstu = haha.Student()\nstu.say()\n"
模块的搜索路径和存储
- 搜索路径
- 加载模块时,系统寻找模块的路径
- 系统默认模块搜索路径
import sys sys.path 属性可以获取路径列表
- 添加搜索路径
sys.path.append(dir)
- 模块的加载顺序
- 1.搜索内存上已经加载好的模块
- 2.搜索Python的内置模块
- 3.搜索sys.path路径
包
- 包是一种组织管理代码的方式,包里面存放的是模块
- 用于将模块包含在一起的文件夹就是包
- 自定义包结构
|---包 |---|---__init__.py 包的标志文件 |---|---模块1 |---|---模块2 |---|---子包(子文件) |---|---|---__init__.py |---|---|---子包模块1 |---|---|---子包模块2
- 包的导入操作
- import package_name
- 直接导入一个包,可以使用init.py中的内容
- 使用方法是:
package_name:func_name package_name.class_name.func_name()
- import package_name as 别名
- 具体用法跟作用方式,跟上述简单导入一致
- 注意的是此种方法是默认对init.py内容导入
- import package.module
- 导入包中某一具体的模块
- 使用方法
package.module.func_name package.module.class.fun() package.module.class.var
- import package.module as 别名
- from ...import 导入
- 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 import *
- 导入包中指定模块的所有内容
- 使用方法
func_name() class_name.func_name()
- 在开发环境中经常会用其他模块,可以在当前包中直接导入其他模块中的内容
- import 完整的包或者模块的路径
- ‘all’的用法
- 在使用from package import 的时候, 可以导入的内容
- ‘init.py’中如果文件为空,或者没有‘all’,那么只可以把‘init‘中的内容导入
- ‘init‘如果设置了‘all’的值,那么则按照‘all’指定的子包或者模块进行加载,如此则不会载入‘init‘中 的内容
- ‘all=['module1','module2',...]'
- import package_name
命名空间
- 用于区分不同位置不同功能但是相同名称的函数或者变量的一个特定前缀
- 作用是防止命名冲突
setName() Student.setName() Dog.setName()