Python面向对象编程

总第104篇

前言

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

图注:后台读者留言

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

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

来看张图片:

图注:知乎大佬的解释

面向对象的基本概念

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

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

#通过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的所有属性和方法/技能。

xiaoming = data_analyst()
xiaoming.name
----------
"数据分析师"
xiaoming.sql()
---------
正在导数据
xiaoming.excel()
---------
正在做表

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

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

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方法中的默认的第一个参数,表明实例本身,可以省略不写。这就是类方法和普通函数的一点不同之处。

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

面向对象的编程的好处

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

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

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

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

先求取student_1的分数情况,

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就可以。

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多加班两小时,所以聪明的(爱偷懒的)技术大牛就发明了函数这种东西,具体执行如下:

先定义求和以及求均值的函数,然后让每个学生分别去调用这两个函数即可。
#定义求和函数
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经过不懈的努力,终于又研究出更加简洁的一种方法,那些无数个加班夜总算没有白加,于是乎就有了本章的内容:

#创建一个类,因为所有学生的方法
#都是一样的(求和以及求均值的的方法是一致的)
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

感谢各位大佬。

原文发布于微信公众号 - 张俊红(zhangjunhong0428)

原文发表时间:2018-04-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏懒人开发

(6.4)James Stewart Calculus 5th Edition:Work

牛顿第二定律: F = ma (这里 dv = ds/dt, da=dv/dt) 于是有

11320
来自专栏C语言及其他语言

[每日一题]最多约数问题(1228)

本次的题目正确率可是低到了一个境界呢!快来试试吧! 题目描述 正整数x 的约数是能整除x 的正整数。正整数x 的约数个数记为div(x)。例如,1,2, 5...

41160
来自专栏贾志刚-OpenCV学堂

图形图像算法中必须要了解的设计模式(2)

AI越来越火热,人工智能已然成风!而人工智能最重要是各种算法,因此机器学习越来越受到追捧,算法越来越被重视。

11720
来自专栏CDA数据分析师

就算不做数据分析师也要学会这8个IF函数

今天所讲的IF函数,包括excel中含有IF的系列函数,共有8个,每个函数列举最了常用的2~3个公式,希望能对同学们有用。 一、IF函数 作用:根据条件进行判断...

21460
来自专栏tkokof 的技术,小趣及杂念

Sweet Snippet 之 Bounce Setting

  又是一篇Sweet Snippet,自己看来都觉得过小,不足以成篇,不过自觉有些趣味,也就随便记一记了,权当自娱自乐 :)

7310
来自专栏take time, save time

你所能用到的数据结构(三)

三、对于效率提高的初次尝试     对于最自然的几种排序算法,数学家们开始思考如何提高排序算法的效率,可以通过数学证明出来如果想达到这个目的,必须想办法将相距...

29470
来自专栏牛客网

吉比特面试经验 游戏研发岗实习生

38100
来自专栏落影的专栏

程序员进阶之算法练习(二十八)

前言 四道题,分别锻炼哈希、贪心、贪心+排序、二分四个能力。 第一题较为简单,后续的题目都需要一定的基础。 贪心是最基础的能力,codeforce有专门的 ...

46990
来自专栏机器学习算法与Python学习

长文 | 手把手教你如何使用python进行数据分析(最好将文章代码自己码一遍)

关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第二 【Python】:排名第三 【算法】:排名第四 原文 http://www.cnbl...

40150
来自专栏take time, save time

Think in 递归

     网上写递归的文章可以用汗牛充栋来形容了,大多数都非常清晰而又细致的角度上讲解了递归的概念,原理等等。以前学生的时候,递归可以说一直是我的某种死穴,原理...

423120

扫码关注云+社区

领取腾讯云代金券