浅析Python中的类、模块、包

类和继承是面向对象编程(OOP)中的重要概念,Python中的大量模块等也都是基于类实现的;模块和包是Python可拓展性和便捷性的支撑,也是我们接触最多的内容。了解Python中的类、模块和包一方面有助于强化写代码时候的逻辑(更清楚地知道自己写的代码-每一步是在干嘛)、提高效率,同时便于我们更好地读懂并复制粘贴别人的代码。本文主要内容:

  1. Python中的模块(module)包(package)
  2. Python中如何定义类(class)
  3. 什么时候需要类?

模块和包

官方文档的介绍——Modules in python

模块:一个.py文件就构成了一个模块,模块名即为去掉后缀之后的名。

:一个包含__init__.py文件+若干子包+若干模块的文件夹,文件夹的名字即为包名,第一个文件是必须(该文件的作用即是为了防止系统将含.py文件的文件夹均识别为包),因此有些时候github上下载别人写好的小工具包可以直接放在文件夹下import使用而不需要install。

  • 模块包含内置模块、标准模块以及第三方模块;包也包括内置的包、第三方包
1
2
3
4
5
6
7
8
9
10
# 在交互窗口中运行,内置的模块路径在c拓展内
>>> import time,os,datetime,pandas
>>> time
<module 'time' (built-in)>
>>> os
<module 'os' from 'D:\\Miniconda3\\lib\\os.py'>
>>> datetime
<module 'datetime' from 'D:\\Miniconda3\\lib\\datetime.py'>
>>> pandas
<module 'pandas' from 'D:\\Miniconda3\\lib\\site-packages\\pandas\\__init__.py'>
  • 官网下载初始Python的源码做一个简单的了解:

下载完成后进入文件夹:A:.4,可以看到其中只有两种文件

  1. 文件夹即包,熟悉的如:json、logging、multiprocessing、urllib
  2. py文件,即脚本/模块,熟悉的如:os.py、re.py、zipfile.py
  3. 一个特殊的空文件夹,site-packages,打开其中有一个文本描述,写的是:本目录用于存放第三方的包(通过pypi/conda安装的包即存放在这)

所以,即便我们不安装额外的包,也可以使用内置的模块及标准库中的模块与包:

1
2
import time, os, re
from multiprocessing import pool

Python的巨大优势就在于可拓展性和便捷,有大量的第三方包可供使用。另外,除了安装第三方包、我们也可以自己写模块和包用于调用。

tip:自己写的py文件放在目录下可以直接import,然后使用其中的变量及函数。通常该文件写完需要调试,这时候可以将运行的代码放在if '__main__'== __main__: 之下,这样在其他脚本import调用该”模块时”也不会执行运行的代码。

定义类

构造函数:

何时需要类?

参考:使用类的原因-讨论

通常,使用Python的内置及第三方模块可以完成我们的工作,并不需要自定义类,但随着工作量的增大和复杂化,或许会有这样的需求,以pandas为例

结合实际讨论,

  1. 属性/结果的保存和即时访问:当我们通过pandas.read_csv()读取一个文件之后,得到一个实例化的对象dataframe,接下来我们可以通过columns,names,head,shape等参数访问其属性,即对象实例化之后我们可以使用和追踪它的状态,就好像创建了一个list,而不只是调用了一个方法。
  2. 便于拓展和重用,可以继承,即方便别人用和自己调用,比如他人可以基于pandas开发geopandas等包,也即是依赖
  3. 结构清晰,好看,从各种包的api文档(如pandasmatplotlibnumpygeopandas……)我们可以看看,其组织结构清楚,便于查阅……
  4. ……

何时使用?

(虽然一直在享受着类的便捷,但个人还没遇到一定得用类的情况hh)

  • 当工作简单或者只是实现一个或者多个函数时,不需要。类的重要一点就是属性和方法组装在了一起,如果只是一个一次性的处理脚本不需要类
  • 编写开源包和模块时
  • 工作量比较大,代码组织感觉比较乱时,可以考虑(理理逻辑,通过多个函数/脚本也可以写出结构清晰的脚本)。