轻松学会python面向对象第6篇---类可以准确描述数据内容

封装,是面向对象三大特性之一,我将其分解为三个方面:

  1. 对数据内容的准确描述
  2. 对数据之间关系的形象描述
  3. 对数据行为的规范和约定

接下来几篇文章降重点讲解封装

1. 程序员真的不善于沟通么?

没有人会否定沟通的重要性,在工作当中,我们需要与其他人进行协作,才能顺利的完成工作内容,能做领导的,一定具备很好的沟通能力,否则,工作难以开展。

在人们眼中,程序员是一群相对比较沉默的群体,甚至是有些木讷,给人一种不善交流沟通的印象。

这种评价正确么?我认为,要分开来看,程序员和程序员群体以外的人沟通,确实存在一些阻碍和困难,但在程序员群体内部,沟通,大多数时候都是极为顺畅的,因为这两种情况下沟通的语言不通。

在与其他程序员沟通时,我们使用的是专业用语,或口头,或书面,如果用代码,甚至一句话都不需要讲。

2. 准确描述数据的内容

在一个系统里,有很多数据需要处理,每个人负责一定的模块,数据在不同的模块之间流转,即便不考虑数据的流转,维护你代码的人也需要知道你所处理的数据是如何定义的。

假设一个系统里,要处理学生的数据,计算学生的考试总分,学生的数据是一个模糊的概念,都有什么呢,接下来,我用3种方式来描述数据

2.1 文字描述

学生信息包括姓名,语文分数,数学分数。

清楚了么?好像是清楚了,但对编程来说,还远远不够,这些信息可以存储在列表里,也可以存储在元组里,还可以存储在字符串里

stu1 = ['小明', 90, 99]
stu2 = ('小明', 90, 99)
stu3 = '小明_90_99'

当文字描述转换为代码时,有多种形式,其他人不可能通过你的文字描述来知晓代码里的表达方式,因此,程序员之间不用这种沟通方式。

2.2 用字典描述

stu_dict = {
    'name': '小明',
    'score': {
        '语文': 90,
        '数学': 99
    },
}

用字典来描述,比起列表,元组,字符串要好的多了,它能相对准确的描述出数据内容以及嵌套关系,事实上,程序员也是这么做的。

在web系统里,你需要为你负责的API接口提供说明文档,介绍接口的访问方式,提供请求示例和返回示例,请求与返回示例就是用类似于字典的json数据来说明的。

这种方法有一定的适用范围,沟通交流并不只是发生在API接口上,在系统内部,每一个有参数的函数都可以视为一个接口,你不可能为每一个函数的参数都写一份说明文档,告知其他人数据的形式和内容。

2.3 用类描述

class Student():
    def __init__(self, name, yw_score, sx_score):
        self.name = name            # 姓名
        self.yw_score = yw_score    # 语文分数
        self.sx_score = sx_score    # 数学分数

使用类,准确的对数据的内容进行了描述,这非常非常关键,假设你是一个项目组的组长,负责分配工作任务,你将计算学生总分的函数sum_score分配给小刚来编写,你只需要提供一个函数定义即可:

def sum_score(student: Student)->int:
    """
    计算学生考试总分数
    :param student: Student类
    :return:
    """
    pass

从py3.5开始,引入了类型系统,允许你指定变量类型。小刚拿到这个尚未完成的函数以后,它需要知道参数student的内容,怎么办呢,他只需要按图索骥,找到类Student的定义就可以了。

类是你写的,他事先并不知道类的定义,但他只要让看到类的定义,就知道该如何进行计算,函数实现如下

def sum_score(student: Student)->int:
    """
    计算学生考试总分数
    :param student: Student类
    :return:
    """
    return student.yw_score + student.sx_score

这个过程中,你和他之间不需要对参数student进行任何语言和文字上的沟通,他自己就能搞清楚。这么看来,程序员之间的沟通还真是高效啊。

3. 类型标注

类型系统是python3.5以后引入的,它不是强制性的要求,python依然是动态类型语言,即便将student标注为Student类,你依然可以在调用函数时传入其他类型的对象。

我个人十分喜欢python的这一变化,动态类型语言不善于构建大型项目,无法追查变量类型是原因之一。

在缺少类型提示的情况下,动态类型语言编写出的代码随着体量的增加,逐渐变得难以维护,尤其在各种语言特性加持下,非凡人能够理解。

这无疑减弱了类在描述数据内容上的能力,增加了沟通维护的成本。引入类型标注后,python在构建大型系统方面的能力一定会得到增强。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案