专栏首页张俊红Python面向对象编程

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),作者:张俊红

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 内连接的两种方式

    在前面的文章中我们讲过两个概念,宽表和窄表,在现实业务中,数据库中很多表存储其实都是以窄表的形式来存储的,但是我们一般从数据库中获取信息的时候,都是需要同时从多...

    张俊红
  • Sklearn参数详解—Adaboost

    今天这篇讲讲集成学习,集成学习就是将多个弱学习器集合成一个强学习器,你可以理解成现在有好多道判断题(判断对错即01),如果让学霸去做这些题,可能没啥问题,几乎全...

    张俊红
  • 数据结构-常用的排序算法

    好久不见哈,我终于又更新了,惊不惊喜,意不意外,哈哈哈哈。等之后会专门写一篇文章给大家汇报汇报我最近在忙什么呢,今天这篇还是接着之前的数据结构系列继续,主要讲讲...

    张俊红
  • SQL server 数据库基本插入、删除命令

    L宝宝聊IT
  • SQL语句汇总(一)——数据库与表的操作以及创建约束

    首先,非常感谢大家对上篇博文的支持,真是让本菜受宠若惊,同时对拖了这么久才出了此篇表示抱歉。  

    _DIY
  • 经典面试题-简述HttpSession 的作用、使用方法,可用代码说明

    HttpSession 中可以跟踪并储存用户信息,把值设置到属性中,有2 个方法:setAttribute(),getAttrribute();

    cwl_java
  • 第一期 | 群问题整理

    问: 请教个问题:a.txt中有1到10,10个乱序数字,数字之间用”,”分割,写一个程序,将文件内容降序排列,数字之间用”,”分割

    微笑的小小刀
  • C++结构体前面为什么会经常使用typedef

    为什么struct关键字后面有结构体名称student了,还需要用typedef再重新给定一个名字呢?

    卡尔曼和玻尔兹曼谁曼
  • 【Java框架型项目从入门到装逼】第十五节 - jdbc模糊查询实现(附带详细调试过程)

    剽悍一小兔
  • Cassandra-java操作——基本操作

      接着上篇博客,我们来谈谈java操作cassandra; 上篇博客的环境:jdk1.7 + python2.7.10 + cassandra2.2.8; 由...

扫码关注云+社区

领取腾讯云代金券