浅析Python中的类、模块、包
类和继承是面向对象编程(OOP)中的重要概念,Python中的大量模块等也都是基于类实现的;模块和包是Python可拓展性和便捷性的支撑,也是我们接触最多的内容。了解Python中的类、模块和包一方面有助于强化写代码时候的逻辑(更清楚地知道自己写的代码-每一步是在干嘛)、提高效率,同时便于我们更好地读懂并复制粘贴别人的代码。本文主要内容:
- Python中的模块(module)和包(package)
- Python中如何定义类(class)
- 什么时候需要类?
模块和包
模块:一个.py文件
就构成了一个模块,模块名即为去掉后缀之后的名。
包:一个包含__init__.py
文件+若干子包+若干模块的文件夹,文件夹的名字即为包名,第一个文件是必须(该文件的作用即是为了防止系统将含.py文件的文件夹均识别为包),因此有些时候github上下载别人写好的小工具包可以直接放在文件夹下import使用而不需要install。
- 模块包含内置模块、标准模块以及第三方模块;包也包括内置的包、第三方包
1 | # 在交互窗口中运行,内置的模块路径在c拓展内 |
- 从官网下载初始Python的源码做一个简单的了解:
下载完成后进入文件夹:A:.4,可以看到其中只有两种文件
- 文件夹即包,熟悉的如:json、logging、multiprocessing、urllib
- py文件,即脚本/模块,熟悉的如:os.py、re.py、zipfile.py
- 一个特殊的空文件夹,site-packages,打开其中有一个文本描述,写的是:本目录用于存放第三方的包(通过pypi/conda安装的包即存放在这)
所以,即便我们不安装额外的包,也可以使用内置的模块及标准库中的模块与包:
1 | import time, os, re |
Python的巨大优势就在于可拓展性和便捷,有大量的第三方包可供使用。另外,除了安装第三方包、我们也可以自己写模块和包用于调用。
tip:自己写的py文件放在目录下可以直接import,然后使用其中的变量及函数。通常该文件写完需要调试,这时候可以将运行的代码放在if '__main__'== __main__:
之下,这样在其他脚本import调用该”模块时”也不会执行运行的代码。
定义类
构造函数:
何时需要类?
参考:使用类的原因-讨论
通常,使用Python的内置及第三方模块可以完成我们的工作,并不需要自定义类,但随着工作量的增大和复杂化,或许会有这样的需求,以pandas为例
结合实际讨论,
- 属性/结果的保存和即时访问:当我们通过
pandas.read_csv()
读取一个文件之后,得到一个实例化的对象dataframe
,接下来我们可以通过columns,names,head,shape等参数访问其属性,即对象实例化之后我们可以使用和追踪它的状态,就好像创建了一个list,而不只是调用了一个方法。 - 便于拓展和重用,可以继承,即方便别人用和自己调用,比如他人可以基于pandas开发geopandas等包,也即是依赖
- 结构清晰,好看,从各种包的api文档(如pandas,matplotlib,numpy,geopandas……)我们可以看看,其组织结构清楚,便于查阅……
- ……
何时使用?
(虽然一直在享受着类的便捷,但个人还没遇到一定得用类的情况hh)
- 当工作简单或者只是实现一个或者多个函数时,不需要。类的重要一点就是属性和方法组装在了一起,如果只是一个一次性的处理脚本不需要类
- 编写开源包和模块时
- 工作量比较大,代码组织感觉比较乱时,可以考虑(理理逻辑,通过多个函数/脚本也可以写出结构清晰的脚本)。