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

相关文章

来自专栏大内老A

开发自己的Data Access Application Block[下篇]

上接:[原创] 我的ORM: 开发自己的Data Access Application Block - Part I 4. Database 下面来介绍重中之重...

2246
来自专栏张善友的专栏

弹出式模态窗体选择文本控件

2006年就要到来了,最近比较忙,很少更新blog,今天发一个模态窗体选择文本控件辞旧迎新.新年在发几个asp.net2.0 webPart控件同各位分享: ...

1907
来自专栏王磊的博客

Net连接mysql的公共Helper类MySqlHelper.cs带MySql.Data.dll下载

MySqlHelper.cs代码如下: using System; using System.Collections.Generic; using System...

4479
来自专栏Golang语言社区

GO语言 TCP传输实例

package main import ( "net" "fmt" ) var ( maxRead = 1100 msgStop = []byt...

3406
来自专栏码匠的流水账

zuul自定义SimpleHostRoutingFilter

zuul的SimpleHostRoutingFilter主要用来转发不走eureka的proxy,里头是使用httpclient来转发请求的,但是有时候我们需要...

1312
来自专栏菩提树下的杨过

基于sliverlight + wcf的web 文字版IM 示例

演示地址: http://task.24city.com/default.html 预览界面: ? 一、布局 采用Grid布局,5行2列 第一行:为登录/注册信...

3226
来自专栏田超学前端

【微信小程序】c# 实现获取openid、session_key 服务端

5230
来自专栏james大数据架构

CSS好看的按钮

好看的按钮 <style> .btn { BORDER-RIGHT: #7b9ebd 1px solid; PADDING-RIGHT: 2px; BORDE...

2007
来自专栏菩提树下的杨过

Silverlight:利用异步加载Xap实现自定义loading效果

关键点: 1.利用WebClient的DownloadProgressChanged事件更新下载进度 2.下载完成后,分析Xap包的程序集Assembly信息 ...

18610
来自专栏xingoo, 一个梦想做发明家的程序员

【插件开发】—— 6 SWT 复杂控件使用以及布局

前文回顾: 1 插件学习篇 2 简单的建立插件工程以及模型文件分析 3 利用扩展点,开发透视图 4 SWT编程须知 5 SWT简单控件的使用与布局搭...

2349

扫码关注云+社区