Python面向对象编程

前言

应后台读者要求,所以有了这篇文章。

图注:后台读者留言

在开始介绍具体的面向对象编程以前,先介绍一下另一个概念:[面向过程编程]。

面向过程编程,重点在于过程(可以理解成how),即以过程为核心,计算机/写代码的人会把精力聚焦在具体的实现过程上,这个过程第一步干什么,第二步干什么,直到最后完成了你的目标。
面向对象编程,重点在于对象(可以理解成who),即以对象为核心,这个对象有什么技能(不止一个技能的),这个对象所拥有的哪些技能够帮你实现你的目标。
前者比较关注怎么做,后者比较关注谁来做。

来看张图片:
图注:知乎大佬的解释

面向对象的基本概念

了解了面向过程和面向对象编程的基本思想以后,我们来介绍面向对象编程中一些基本概念。

类(Class): 用来描述具有相同的属性和方法对象的集合。其实类的本意就是类别,表示同类别事物(对象)的一个组合,比如说从事数据分析这个岗位的这些人就是一个类,他们有共同的属性(数据分析师&喜欢用数据说话)和共同的方法/技能(写sql、操作excel、写脚本)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#通过class关键词来创建一个类
#定义了名为“data_analyst”(数据分析)的一个类
class data_analyst:
name = "数据分析师"
feature = "喜欢用数据说话"

def sql(self):
print("正在导数据")

def excel(self):
print("正在做表")

def python(self):
print("正在写脚本")

类属性:就是对类的属性做一些设定,比如名字、特征之类的,上面代码中的namefeature就是类data_analyst的属性。

类方法:就是类的一些技能,用def来指定,和定义函数有点类似(注意是类似,还是有些不同的,后面讲),也可以理解成类的对象所拥有的技能。

对象:就是类中的具体一个事物,是关于类而实际存在的一个例子,即实例。比如说众多数据分析师中的小明,就是类data_analyst的一个对象。而小明这个对象具有类data_analyst的所有属性和方法/技能。

1
2
3
4
xiaoming = data_analyst()
xiaoming.name
----------
"数据分析师"

1
2
3
xiaoming.sql()
---------
正在导数据
1
2
3
xiaoming.excel()
---------
正在做表

实例化:实例化的过程就是类到对象的过程,实例其实就是创建一个实际例子,类的具体对象。

__init__:init是初始化的意思,用在实例化的过程中,当对类进行实例化时(创建一个新的实例),类会自动调用该函数。上面只是创建了小明一个实例,我们再来多创建几个其他的数据分析师(怎么感觉有点不对劲),比如小张、小李。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class data_analyst:

def __init__(self,name,skill):
self.name = name
self.skill = skill

def working(self):
if self.name == xiaozhang:
print("小张正在写:{}".format(self.skill))
else:
print("小李正在写:{}".format(self.skill))

xiaozhang=data_analyst("xiaozhang","sql") #创建xiaozhang
print("小张的名字是:{}".format(xiaozhang.name))
print("小张的技能是:{}".format(xiaozhang.skill))
print(xiaozhang.working()) #调用类的working方法

print("---------------------")

xiaoli=data_analyst("xiaoli","python") #创建xiaoli
print("小李的名字是:{}".format(xiaoli.name))
print("小李的技能是:{}".format(xiaoli.skill))
print(xiaoli.working()) #调用类的working方法

---------------------
小张的名字是:xiaozhang
小张的技能是:sql
小张正在写:sql
---------------------
小李的名字是:xiaoli
小李的技能是:python
小李正在写:python

self:self是init和def方法中的默认的第一个参数,表明实例本身,可以省略不写。这就是类方法和普通函数的一点不同之处。

把上面的基本概念总结一下,就是把具有相同属性和方法的对象聚成一个类,然后在这个类里面去声明一些属性、定义一些方法,最后通过实例化创造几个实例/对象,通过实例化创建的对象就可以去引用类中的每个属性和调用类中的每个方法。

面向对象的编程的好处

前面我们介绍了面向过程的面向对象的基本思想,也介绍了面向对象中的一些基本概念,接下来我们再看看面向对象有什么特别的优点,只有这样意识到做一件事事情的好处,我们才更愿意走出舒适区(毕竟我们已经习惯了面向过程编程的思维),去接受这个新的东西。通过下面这个实例,我们来看一下编程的几个不同发展阶段。

已知每个学生各科分数,求取每个学生的总分,平均分。

1
2
3
student_1=[80,60,75,90]
student_2=[70,80,65,85]
student_3=[70,75,90,80]

最开始的时候我们是这样做的:

先求取student_1的分数情况,

1
2
student_1_sum=(student_1[0]+student_1[1]+student_1[2]+student_1[3])
student_1_mean=(student_1[0]+student_1[1]+student_1[2]+student_1[3])/4

要求student_2和student_3的分数情况,我们可以把student_1的代码复制过来,改一下student就可以。

1
2
3
4
5
student_2_sum=(student_2[0]+student_2[1]+student_2[2]+student_2[3])
student_2_mean=(student_2[0]+student_2[1]+student_2[2]+student_2[3])/4

student_3_sum=(student_3[0]+student_3[1]+student_3[2]+student_1[3])
student_3_mean=(student_3[0]+student_3[1]+student_3[2]+student_1[3])/4

后来大家发现上面的代码有点冗余,不仅看起来难受,更重要的编写耗费时间也很长,又得让程序员gg多加班两小时,所以聪明的(爱偷懒的)技术大牛就发明了函数这种东西,具体执行如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
先定义求和以及求均值的函数,然后让每个学生分别去调用这两个函数即可。
#定义求和函数
def sum(student):
student_sum=(student[0]+student[1]+student[2]+student[3])
return student_sum

#定义求均值函数
def mean(student):
student_mean=(student[0]+student[1]+student[2]+student[3])/4
return student_mean

#求取student_1的总分和均值
student_1_sum=sum(student_1) #调用sum函数求总分
student_1_mean=mean(student_1) #调用mean函数求均值

#求取student_2的总分和均值
student_2_sum=sum(student_2)
student_2_mean=mean(student_2)

#求取student_3的总分和均值
student_3_sum=sum(student_3)
student_3_mean=mean(student_3)

再后来,善于琢磨的程序员gg经过不懈的努力,终于又研究出更加简洁的一种方法,那些无数个加班夜总算没有白加,于是乎就有了本章的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#创建一个类,因为所有学生的方法
#都是一样的(求和以及求均值的的方法是一致的)
class student:

def sum(self,student):
student_sum=(student[0]+student[1]+student[2]+student[3])
print(student_sum)

def mean(self,student):
student_mean=(student[0]+student[1]+student[2]+student[3])/4
print(student_mean)

#创建student_score对象
student_score=student()

#求取student_1的总分和均值
student_1_sum=student_score.sum(student_1) #引用student类的sum方法
student_1_mean=student_score.mean(student_1) #引用student类的mean方法

#求取student_2的总分和均值
student_2_sum=student_score.sum(student_2)
student_2_mean=student_score.mean(student_2)

#求取student_3的总分和均值
student_3_sum=student_score.sum(student_3)
student_3_mean=student_score.mean(student_3)

最后

关于面向对象的知识点还有很多,我们本章节就主要讲这么多,让大家对面向对象有个基本认识,能够日常使用就ok,更加深层次的知识还需要大家自行去探索。

在写本章的时候主要参考了以下几个链接:
https://www.zhihu.com/question/27468564
https://www.zhihu.com/question/19729316
http://www.cnblogs.com/wupeiqi/p/4493506.html http://www.cnblogs.com/wupeiqi/p/4766801.html
感谢各位大佬。

张俊红 wechat
扫描二维码,关注我的公众号,获取更多内容
您的支持是我持续分享的动力!