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 条评论
登录 后参与评论

相关文章

来自专栏工科狗和生物喵

【计算机本科补全计划】指令:计算机的语言(MIPS) --计算机组成原理

正文之前 今天的主题就是,重新学一次汇编语言,不过总感觉跟单片机的汇编语言没啥差别,不过就是地址变宽,然后一些限制多了不少,因为计算机要进行大量的运算,所以更加...

4827
来自专栏个人随笔

房上的猫:吃货联盟项目

一.首先先定义部分成员变量: String[] name = new String[4];// 订餐人 String[] greens = new St...

33810
来自专栏斑斓

一个完整的TDD演练案例(三)

之所以将“验证输入是否合法”放在第三个任务,是因为它不属于happy path的范畴。它属于辅助业务,重要性相对次之。

645
来自专栏落影的专栏

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

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

4439
来自专栏F_Alex

数据结构与算法(一)-初识

前言:一个程序员前期可能需要各种业务和编程的能力,但是后期如果想要提高就需要有一个扎实的基础,厚积薄发,所以最近抽空学了下数据结构与算法,颇有感触,学习过程虽然...

742
来自专栏转载gongluck的CSDN博客

黑暗的内存管理

黑暗的内存管理 很多人对 C 语言深恶痛绝,仅仅是因为 C 语言迫使他们在编程中必须手动分配与释放内存,然后通过指针去访问,稍有不慎可能就会导...

3536
来自专栏java工会

深入浅出设计模式-抽象工厂模式

1994
来自专栏数据结构与算法

P2580 于是他错误的点名开始了

题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人。 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉...

2737
来自专栏小樱的经验随笔

C/C++中__builtin_popcount()的使用及原理

__builtin_popcount()用于计算一个 32 位无符号整数有多少个位为1 Counting out the bits     可以很容易的判...

3325
来自专栏Laoqi's Linux运维专列

if 条件语句

3568

扫码关注云+社区