暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

(二)Python中的封装思想

统计美学 2021-10-05
1258
Python里面存在这样的封装递进关系:
  • 数据可以封装在容器
  • 代码可以封装在方法

  • 方法属性可以封装在

  • 上述三类对象可以打包在模块

  • 多个模块可以打包成一个

  • 模块和包都可以称为多个库构成框架

一、模块(modules)

模块,英文为Modules,本质上是一个Python程序文件,以.py作为文件后缀。
通过使用模块,不仅可以有效地避免命名空间的冲突,还可以将一个较大的程序分为多个文件,提升代码的可维护性和可重用性。
(一)模块导入
导入一个模块一般有两种方法:

import modulename1 [as alias1], modulename2 [as alias2], …from modulename import 成员名1 [as 别名1],成员名2 [as 别名2],…

注意:模块名里面只要写py文件的名字,不需要加后缀。另外,尽量不要使用:from demo import * 的方式进行导入,否则很容易发生命名空间冲突。
(二)if __name__ == '__main__'
在完成一个模块的编写之前,我们一般会对模块中的功能进行测试,看看各项功能是否正常运行。对于这些测试的代码,我们希望只在直接运行这个py文件的时候执行,在用其他的程序import这个模块的时候不要执行,这个时候就要借助Python内置的__name__变量。__name__变量的取值是什么可以分两种情况,当一个py文件被直接运行的时候,__name__变量的值为__main__。当一个py文件被import到其他程序的时候,这个py文件里面的__name__变量的值为这个py文件的名字。我们可以利用__name__变量的这个特点,结合一个if语句,让我们import某一个模块的时候只用到它提供的功能,而不要运行里面用来测试的代码:

if __name__ == '__main__':    # put your code here

(三)模块文档(类似于函数文档)
模块的说明文档放在py文件的开头,用成对的三个英文引号引起来,然后我们可以用模块的__doc__属性或help函数来访问模块的说明文档:

"""模块的说明文档放在这里""""""put your code here"""import demohelp(demo)print(demo.__doc__)

(四)模块的路径
对于用import语句导入的模块,Python会按照下面的路径列表顺序地查找我们需要的模块:
  • 当前的工作目录;
  • PYTHONPATH(环境变量)中的每一个目录;

  • Python 默认的安装目录。

如果我们在导入自己写的模块的时候,Python解释器提示找不到这个模块,说明我们写的模块没有放在上述三类路径,由于这三类目录都保存在标准模块sys的sys.path变量中,因此我们有三种解决方法。
  • 向sys.path变量中临时添加模块文件所在的完整路径
  • 将模块移动到sys.path 变量中已包含的路径中

  • 修改path 系统的环境变量

其中,环境变量又分为用户变量(仅对当前用户生效)和系统变量(对系统里所有用户均生效)。Python在使用path变量时,会先按照系统path变量找,然后按照用户path变量的路径找。
二、包(package)
在比较大型的项目中常常需要编写、用到大量的模块,此时我们可以使用包(Package)来管理这些模块。
(一)什么是包?
简单来说,Python包就是里面装了一个__init__.py文件的文件夹!它具有下面3个性质:
  • 它实质上是一个文件夹
  • 该文件夹里面一定有__init__.py模块,其他的模块可以有也可以没有

  • 一个包里面还可以装其他的包,称为子包(当然子包里面也有其自己的__init__.py模块)

(二)什么是__init__.py文件?(前后各有 2 个下划线'_')
  • 它本身是一个模块

  • 这个模块的模块名不是__init__,而是这个包的名字,也就是装着__init__.py文件的文件夹的名字

  • 它的作用是将一个文件夹变为一个Python模块

  • 它可以不包含代码,不过一般会包含一些Python初始化代码,例如批量导入我们需要用到的模块,这样我们就不用在用到的时候再一一导入,在这个包被import的时候,这些代码会自动被执行

(三)导入包
导入包的方法和导入模块比较类似,只不过由于层级比一般模块多了一级,所以多了一条导入形式:

import 包名[.模块名 [as 别名]] # 其中matplotlib为包,pyplot为包中的一个模块,plt为模块别名import matplotlib.pyplot as pltfrom 包名 import 模块名 [as 别名]from 包名.模块名 import 成员名 [as 别名]

注意:我们在导入包的时候,实际上是导入了它的__init__.py文件!!!!!!!!!!

三、库(Libraries,抽象概念)

什么是库?在python中,包和模块都可以称为库!!!
严格来说,Python中是没有库(library)的,模块(module)和包(package)都是Python语法中有的概念,而库只是一个通俗的说法,借鉴于C、C++等其它程序设计语言的叫法(函数库),在python中它是一个抽象概念,没有直接实体,平时说的库即对包或模块的简称、统称!!!

我们可以打开Python的安装目录,里面有一个叫做Lib的文件夹,打开这个文件夹之后就会发现很多“库”都在里面,如我们常用的os、sys、random、math、re、time等标准库都在里面,这些“库”都是一个个的python文件(即模块),而我们打开site-packages文件夹又会发现matplotlib、seaborn、numpy、pandas、scipy、sklearn、lightgbm、statsmodels和requests、nltk这些“库”,又是一个一个的文件夹(里面都有__init__.py),也就是包!

我们一般将python内置的模块和包称为标准库,如上面提到的os、random、re...非内置模块和包称为第三方库,如上面提到的numpy、pandas、sklearn...

四、框架(frameworks,抽象概念)

从形式上讲,框架就是一个包;从功能上讲,框架是为解决一个或一类问题而开发的产品!
那框架与库有什么不同?相对于库来说,框架往往集成了多种库的功能,用户一般只需要使用框架内提供类即可实现全部功能。从某种程度上可以说,框架是对库的封装,或者说框架是库的升级版!!!显然,框架会方便开发,将某类项目中必须实现的代码直接实现,你只需要去关注你与别项目不同的部分。如scrapy爬虫开发框架Django web应用开发框架pyspark大数据框架 和 PyTorch、Keras、tensorflow深度学习框架等等。
举个栗子,现在需要开发一个机器学习预测模型,在程序设计阶段,我们一般都需要导入pandas、sklearn、statsmodels、matplotlib等库进行开发,如果我们将它们集成为一个包,那这个包就可以称为“机器学习框架”,而不再是一个个机器学习包/库,我们可以仅使用这一个框架,来完成模型开发的一整套流程!!!

五、总结

我们以两个例子来体会这些概念
  • 类(对象共性的抽象):西瓜(属性,方法)
  • 属性(对象拥有的特征):重量,颜色,口感...

  • 方法(对象提供的服务):直接吃,榨汁喝,当柴火...

  • 对象(类的实例化):西瓜1,西瓜2...

  • 模块(类的封装):水果模块(西瓜,青柠,橙子,柚子...)

  • 包(模块的封装):食物包(水果模块,零食模块,早餐模块...)

  • 库(模块或包):水果库,食物库

  • 框架(库的集成):食物框架(食物库,养殖库,种植库,烹饪库...)

有了食物框架,我们就可以完成从种植、养殖到制作、烹饪最后到享用美食的全过程了!^_^
  • 类:DataFrame
  • 属性:index, columns...

  • 方法:fillna(), astype()...

  • 对象:df1, df2...

  • 模块:reshape,series...

  • 包/库:pandas

有了pandas包,我们就可以方便的进行数据处理了~

扫描二维码获取

更多精彩

统计美学


文章转载自统计美学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论