模块、I/O、异常、面向对象
模块
import语句
import语句执行之后,
python解释器会按照搜索路径来搜索对应模块,
搜索路径由一系列目录名组成
1 | import sys |
[
‘D:\CS_Demo\后端\Python Demo\2023_python_demo’,
‘D:\CS_Demo\后端\Python Demo\2023_python_demo’,
‘D:\PyCharm\PyCharm 2020.3.3\plugins\python\helpers\pycharm_display’,
‘D:\python\python39.zip’,
‘D:\python\DLLs’,
‘D:\python\lib’,
‘D:\python’,
‘D:\python\lib\site-packages’,
‘D:\PyCharm\PyCharm 2020.3.3\plugins\python\helpers\pycharm_matplotlib_backend’
]
搜索路径是何时被确定的?
答: 在Python编译或安装的时候被确定的
也可以通过定义环境变量的方式来确定搜索路径
因此,可以通过手动添加sys.path修改搜索路径
当A模块引用B模块内变量或方法时,
B模块中会运行的代码不仅仅只有被引用的部分,
事实上,B模块的整个主程序都将运行
如何分辨程序是自身执行还是引用执行呢?
答: name
1 | if __name__ == '__main__': |
- dir(model) 获取模块内定义的所有名称的字符串列表
- getattr(obj, str) 根据字符串名称str获取obj中的某个属性obj.str
1 | for fun in [i for i in dir(model) if not i.startswith('__')]: |
包
目录只有在包含**init.py**文件时才会被认作是一个包:
root_package
init.py
package_A
init.py
AAA.py
BBB.py
…
package_B
init.py
CCC.py
DDD.py
…
使用点模块名称获取某个包内的模块时,如:A.B.C,
访问到的每一层包结构都会调用其中的**init.py**
I/O
output
- str 返回用户易读的表达形式
1
2
3
4
5
6s = 'hello\nworld'
'''
hello
world
'''
print(str(s)) - repr 返回解释器易读的表达形式
1
2s = 'hello\nworld'
print(repr(s)) # 'hello\nworld'
以下三个方法全是用于创建指定len长度字符串的,
但是在源字符串长度小于目标长度时,
填充的方法不同:
- rjust(len)
- 向字符串左侧填充空格
- ljust(len)
- 向字符串右侧填充空格
- center(len)
- 像字符串两侧填充空格
仅占位 {}
1 | "index1:{} index2:{} index3:{}".format("index1","index2","index3") |
指定索引 {index}
1 | print("index2:{1} index3:{2} index1:{0}".format(1, 2, 3)) |
指定关键字 {keyword}
1 | print('{key2} {key1} {key3}'.format(key1='dog',key2='you',key3='!!!')) |
指定索引和格式 {index:format}
1 | print("{0:2d} {1:3d} {2:4d}".format(10, 10**2, 10**3)) |
格式化之前进行附加操作 {!a|!s|!r}
- !a ascii()
- !s str()
- !r repr()
1 | print('{!a} {!s} {!r}'.format('index1', 'index2', 'index3')) |
传入字典
1 | team = { "John":"Doctor", "Nancy":"Fighter" } |
使用参数解构的方式同样也能实现传入字典的功能
1 | team = { |
1 | print('0.1'.zfill(5)) # 000.1 |
文件
1 | open(filename, mode) |
mode有如下几种选项:
- r 默认值,只读
- w 写
- a 追加
- r+ 读写
- read(size) 读取size长度的字符串/字节对象
- readline() 读取一行
- readlines() 读取所有行
- next() 读取文件下一行
- truncate([size]) 截取文件
- write(string) 写入文件
- string 需要写的内容
- return 写入的字符串长度
- writelines(sequence) 写入一个序列字符串列表
- tell() 文件对象所处索引位置
- seek(offset, from_what) 移动文件对象索引位置
- from_what = 0 从首行首字开始移动
- from_what = 1 从当前位置往后移动
- from_what = 2 从结尾往前移动-offset个字符
- close() 关闭释放文件资源
- flush() 刷新文件内部缓冲
- fileno() 返回整型文件描述符
- 用于底层操作
- isatty() 文件是否连接到一个终端设备
一个根据目录文件引入指定模块的功能:
1 | import importlib |
pickle模块
序列化
- 程序对象 → 文件
- 程序对象存储到文件
1
pickle.dump(obj, file, [,protocol])
反序列化
- 文件 → 程序对象
- 使用文件内容创建程序对象
1
x = pickle.load(file)
序列化
1 | import pickle |
反序列化
1 | import pprint, pickle |
异常
1 | try: |
不写就是捕获全部错误:
1 | except: |
一次捕获多个错误:
1 | except (TypeError, NameError, ...): |
捕获同时生成错误信息:
1 | except TypeError as error: |
分类捕获:
1 | except TypeError: |
try-except-else:
1 | try: |
1 | raise Error |
1 | ''' |
异常类需要继承自Exception类
1 | class MyError(Exception): |
当某个模块可能抛出多种异常错误时,
一般为这个包建立一个基础异常类,
基于此类创建不同的子类
1 | class Error(Exception): |
1 | try: |
1 | f = open('xxx','wb') |
当上面文件操作过程中出现错误时,程序会直接退出,无法保证close方法的执行
python中一些对象定义了标准的清理行为,
一旦系统不需要它,标准清理行为就会执行
如何保证标准清理行为被正确调用?
答: 使用关键词with语句
with语句保证定义了标准清理方法的对象在使用完后指定会正确执行清理方法
1 | with open('XXX') as f: |
面向对象
类方法的第一个参数必须是self
self就是实例自身
init
类在实例化操作时会自动调**init**方法进行初始化操作
def __方法名(params):
只能在类内调用的方法
重写专有方法能实现运算符重载
1 | class Dog: |
1 | class DerivedClassName(Base1, Base2, ...): |
当多继承的类调用一个属性或方法时,
会按照如下顺序对属性进行查找:
- 子类自身中查找
- 继承参数从左到右进行查找