python进阶实战:如何使用自定义模块(包)?
有时,我们希望在py文件中导入其他py文件中的函数或类等功能,这样就可以将自己编写的代码进行重复使用,并且可以规范化积累自己的代码,成为自己代码学习的重要成果。当然,可以将这些模块化的代码共享出来,供大家一起学习和使用,也是一件非常有成就的事。
下面就来具体地、细致地、实操性的讲讲如何来建立和使用自定义的模块包。
一、建立自定义py文件
例如,我们使用python的IDLE代码编辑器(文件模式下),写了一个简化的类ReadCSV,这个类的功能就是实现可以读取不同编码的CSV文件:
将以上代码保存为read.py文件,然后在Python的安装路径的Lib/site-packages/下面新建一个文件夹myread,即Lib/site-packages/myread/,文件夹myread就是python的模块或者包。
C:\Users\fqbfqb\AppData\Local\Programs\Python\Python310\Lib\site-packages\myread
之后,将文件read.py拷贝到文件夹myread里面,再在文件夹myread里面新建一个名称为‘__init__.py’文件,该文件的内容可以为空。文件夹myread的内容如下所示:
二、使用文件read.py里面的功能
那么,我们如何使用自定义模块myead里面的功能呢?
首先,我们重启下python的IDLE,在命令行模式下,使用from myread.read import ReadCSV,即下图所示,也就是从myread文件夹的read.py文件导入ReadCSV类:
from myread.read import ReadCSV
r = ReadCSV('d:/fqb/1.csv')
r.encodings
['utf-8', 'ansi', 'gbk']
当然,也可以直接导入文件夹myread,即import myread,然后这样使用类:
import myread
r = myread.read.ReadCSV('d:/fqb/1.csv')
r.encodings
['utf-8', 'ansi', 'gbk']
三、修改类的属性
比如,我们要增加类ReadCSV的属性encodings的元素:
from myread.read import ReadCSV
r = ReadCSV('d:/fqb/1.csv')
r.get_encodings()
['utf-8', 'ansi', 'gbk']
r.mend_encodings('utf-8-sig')
r.get_encodings()
['utf-8', 'ansi', 'gbk', 'utf-8-sig']
r2 = ReadCSV('d:/fqb/2.csv')
r2.get_encodings()
['utf-8', 'ansi', 'gbk', 'utf-8-sig']
我们看到,类ReadCSV有2个实例对象r和r2,实例r修改了类的属性,那么实例r2的属性也同步修改了,也就是类的属性在多个实例之间是共享的,不是相互独立的。
但是,当我们关闭IDLE,再次导入ReadCSV类的时候,类的属性encodings的值还是以前的值,即['utf-8', 'ansi', 'gbk'],而不是新增后的值。这说明,类的属性的值的修改,只在当前的运行时是有效的,无法持久化保存下来。要想持久化修改,必须更新模块myread或者更新模块myread里面的read.py文件。