Python高级语法——包

mac2025-08-27  15

1. 模块

一个模块就是一个包含python代码的文件,后缀名是.py就可以,模块就是个python文件为什么用模块 程序太大,编写维护非常不便,需要拆分模块可以增加代码重复利用的方式当做命名空间使用,避免命名冲突 如何定义模块

模块就是一个普通文件,所以任何代码可以直接书写

不过根据模块的规范,最好在模块中编写一下内容

函数 (单一功能)类 (相似功能的组合,或者类似业务模块)测试代码

如何使用模块

模块直接导入 假如模块名称直接以数字开头,需要借助importlib帮助 语法 import module_name module_name.function_name module_name.class_name案列 python_advanced_01.py, python_advanced_02.py #python_advanced_01.py #包含一个学生类 #一个sayHello函数 #一个打印语句 class Student(): 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 sayHello(): print("欢迎来到这里!") print("我是模块01.") #python_advanced_02.py import python_advanced_01 student = python_advanced_01.Student() student.say() python_advanced_01.sayHello() ''' 输出结果: 我是模块01. My name is noname 欢迎来到这里! ''' import 模块 as 别名 导入的同时给模块起一个别名其余用法跟第一种相似案例 python_advanced_03.py # python_advanced_03.py import python_advanced_01 as p student = p.Student("abby", 20) student.say() p.sayHello() ''' 输出结果: 我是模块01. My name is abby 欢迎来到这里! ''' from module import class_name, func_name 按上述方法有选择性导入使用的时候可以直接使用导入的内容,不需要前缀案例 python_advanced_04.py # python_advanced_04.py from python_advanced_01 import Student, sayHello stu = Student("Jack", 30) stu.say() sayHello() ''' 我是模块01. My name is Jack 欢迎来到这里! ''' from module import * 导入模块所有内容案例 python_advanced_05.py # python_advanced_05.py from python_advanced_01 import * sayHello() stu = Student("Jason", 35) stu.say() ''' 输出结果: 我是模块01. 欢迎来到这里! My name is Jason ''' if __name__ == '__main__' 的使用 可以有效避免模块代码被导入的时候被动执行的问题建议所有程序的入口都已此代码为入口 #此判断语句建议一直作为程序入口 if __name__ == '__main__': print("我是模块01.")

2. 模块的搜索路径和存储

什么是模块的搜索路径 加载模块的时候,系统会在哪些地方寻找此模块 系统默认的模块搜索路径 import sys sys.path 属性可以获取路径列表 #案例 python_advanced_06.py#python_advanced_06.py import sys print(type(sys.path)) for p in sys.path: print(p) ''' 输出结果: <class 'list'> D:\python practice\basic_practice\practice D:\python practice\basic_practice D:\python practice\basic_practice\venv\Scripts\python37.zip D:\python\DLLs D:\python\lib D:\python D:\python practice\basic_practice\venv D:\python practice\basic_practice\venv\lib\site-packages D:\python practice\basic_practice\venv\lib\site-packages\setuptools-40.8.0-py3.7.egg D:\python practice\basic_practice\venv\lib\site-packages\pip-19.0.3-py3.7.egg ''' 添加搜索路径 sys.path.append(dir)模块的加载顺序 搜索内存中已经加载好的模块搜索python的内置模块搜索sys.path路径

3. 包

包是一种组织管理代码的方式,包里面存放的是模块

用于将模块包含在一起的文件夹就是包

自定义包的结构 /--- 包 /---/---__init__.py 包的标志文件 /---/--- 模块1 /---/--- 模块2 /---/--- 子包(子文件夹) /---/---/---__init___.py 包的标志文件 /---/---/--- 子包模块1 /---/---/--- 子包模块2

包的导入

import package_name

直接导入一个包,可以使用__init__中的内容使用方式是: package_name.func_name package_name.class_name.func_name()

import package_name as alias

具体用法跟作用方式,跟上述简单导入一致注意的是此种方法是默认对__init__.py内容的导入案例 如下: #package pkg01的__init__.py文件 def inInit(): print("I am in inInit function.") #python_advanced_07.py import pkg01 pkg01.inInit() ''' 输出结果: I am in inInit function. '''

import package.module

导入包中具体某一个模块使用方法: package.module.func_name package.module.class_name.fun() package.module.class_name.var案例 python_advanced_08.py #package pkg01下面的p01.py模块 #包含一个学生类 #一个sayHello函数 #一个打印语句 class Student(): 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 sayHello(): print("欢迎来到这里!") print("我是模块01.") #python_advanced_08.py import pkg01.p01 stu = pkg01.p01.Student() stu.say() pkg01.p01.sayHello() ''' 输出结果: 我是模块01. My name is noname 欢迎来到这里! '''

import package.module as alias

from … import 导入

from package import module1, module2, module3 此种导入方法不执行__init__ 的内容案例 python_advanced_09.py #python_advanced_09.py from pkg01 import p01 stu = p01.Student("Abby",18) stu.say() p01.sayHello() pkg01.inInit() ''' 输出结果: Traceback (most recent call last): File "D:/python practice/basic_practice/practice/python_advanced_09.py", line 7, in <module> pkg01.inInit() NameError: name 'pkg01' is not defined 我是模块01. My name is Abby 欢迎来到这里! ''' from package import *

导入当前包__init__.py 文件中所有的函数和类

使用方法: func_name() class_name.func_name() class_name.var

案例 python_advanced_10.py, 注意此种导入的具体内容

#python_advanced_10.py from pkg01 import * inInit() stu = Student("Abby",18) stu.say() sayHello() ''' 输出结果: Traceback (most recent call last): File "D:/python practice/basic_practice/practice/python_advanced_10.py", line 5, in <module> stu = Student("Abby",18) NameError: name 'Student' is not defined I am in inInit function. ''' from package.module import * 导入包中指定的模块的所有内容使用方法: func_name() class_name.fun() 在开发环境中经常会用到其他模块,可以在当前包中直接导入其他模块中的内容 import 完整的包或者模块的路径 __all__ 的用法 在使用from package import * 的时候,* 可以导入的内容__init__.py 中,如果文件为空,或者没有__all__的时候,那么只可以把__init__ 中的内容导入,即导入空内容.__inin__ 如果设置了__all__ 的值,那么则按照__all__指定的子包或者模块进行载入,不会载入__init__中的其它内容__all__= ['module1', 'module2', 'package1'......] #python_advanced_11.py from pkg02 import * stu = p01.Student("Abby",18) stu.say() p01.sayHello() inInit() ''' 输出结果: 我是模块01. My name is Abby 欢迎来到这里! Traceback (most recent call last): File "D:/python practice/basic_practice/practice/python_advanced_11.py", line 7, in <module> inInit() NameError: name 'inInit' is not defined '''

4. 命名空间

用以区分不同位置,不同功能,但相同名称的函数或者变量的一个特定前缀作用是防止命名冲突 setName() Student.setName() Dog.setName()
最新回复(0)