我先说说 类、对象在实际编程中有啥好处,为啥要用它们再给你解释怎么去理解它们

类的好处主要有 方便复用(如果你用函数写,就要复制整块代码,增加了代码量,增加了出错率)方便扩展(函数写段代码,若要升级、扩展,都十分复杂,容易出错,用类来扩展,则方便清晰)方便维护(因为类是把抽象的东西映射成我们常见的,摸得到的东西,容易理解,维护也方便)

举几个例子:比如你是玩具厂的工程师,你要制作一个机器,可以批量制作鸭子形状的玩具,也许你的思路如下

def makeDuckMoth():#这里可以放其他制作细节print('鸭子嘴巴制作完毕')def makeDuckEar():#这里可以放其他制作细节print('鸭耳朵制作完毕')def makeDuckEye():#这里可以放其他制作细节print('鸭眼睛制作完毕')def makeDuckHead():#这里可以放其他制作细节print('鸭头制作完毕')def makeDuckWing():#这里可以放其他制作细节print('鸭翅膀制作完毕')def makeDuckBody():#这里可以放其他制作细节print('鸭身体制作完毕')def makeDuckFoot():#这里可以放其他制作细节print('鸭脚制作完毕')def makeDuckMerge():#这里可以放其他制作细节print('鸭子组装完毕')makeDuckMoth() #制作鸭嘴巴
makeDuckEar() #制作鸭耳朵
makeDuckEye() #制作鸭眼睛
makeDuckHead() #制作鸭头
makeDuckWing()  #制作鸭翅膀,注意,猪是没有翅膀的
makeDuckBody() #制作鸭身体
makeDuckFoot() #制作鸭脚
makeDuckMerge() #合并鸭子的各个部位,组装成最终鸭子

你发现,自己好厉害,居然学会了整个鸭子的制作流程

第二天,老板让你,制作猪形状的玩具,难道你的代码如下:?

def makePigMoth():#这里可以放其他制作细节print('猪嘴巴制作完毕')def makePigEar():#这里可以放其他制作细节print('猪耳朵制作完毕')def makePigEye():#这里可以放其他制作细节print('猪眼睛制作完毕')def makePigHead():#这里可以放其他制作细节print('猪头制作完毕')def makePigBody():#这里可以放其他制作细节print('猪身体制作完毕')def makePigHand():#这里可以放其他制作细节print('猪手制作完毕')def makePigFoot():#这里可以放其他制作细节print('4只猪脚制作完毕')def makePigMerge():#这里可以放其他制作细节print('猪组装完毕')makePigMoth() #制作猪嘴巴
makePigEar() #制作猪耳朵
makePigEye() #制作猪眼睛
makePigHead() #制作猪头
makePigBody() #制作猪身体
makePigFoot() #制作4只猪脚
makePigMerge() #合并猪的各个部位,组装成最终猪

这样来,你确实完成了工作,但有没有觉得 有点累?

是不是觉得,猪和鸭子有很多相似之处?

如果你学会了,类的用法,可以非常轻松,下面是类的用法

类就像是基因的制造图纸,我们人类,生的小孩,也是两只手,两只脚,一个嘴巴,除非变异,否则不会多出一只脚的,之所以这样有序的发展,是因为我们身体里,有基因这张图纸控制着我们的繁衍现在我们给上面例子中的制作 鸭子、猪 建立一个通用的制作基因表,利用他们相似制作流程 建立基因表。

class Animal(object):'''猪和鸭子的基类(基因图纸表)'''def __init__(self, name): # 实例化的时候传入要制作的东西名字,如猪、鸭子self.name = name def makeMoth(self):#这里可以放其他制作细节  print(self.name+'的嘴巴 制作完毕') #这里的self.name就是获取我们传入的namedef makeEar(self):#这里可以放其他制作细节  print(self.name+'的耳朵 制作完毕') def makeEye(self):#这里可以放其他制作细节  print(self.name+'的眼睛 制作完毕') def makeHead(self):#这里可以放其他制作细节  print(self.name+'的头 制作完毕') def makeBody(self):#这里可以放其他制作细节  print(self.name+'的身体 制作完毕') def makeFoot(self):#这里可以放其他制作细节  print(self.name+'的脚 制作完毕') def makeMerge(self):#这里可以放其他制作细节  print(self.name+'合并完毕') def makeAll(self): # 一条龙。直接跑完整个流水线self.makeMoth()self.makeEar()self.makeEye()self.makeHead()self.makeBody()self.makeFoot()self.makeMerge()

你可以看到,

上面的图纸里,我们没有放 makeWing() #制作翅膀,那是因为猪不会飞,我们只放猪和鸭子共有的、相同的东西

接下来,用这个类,继承给Pig,代码如下

class Pig(Animal):  # 括号里写Animal,意思是Pig继承Animal的所有特性,类似你继承你老爸的基因def makeMoth(self):#这里加详细的猪嘴巴制作流程,如长嘴巴,有两个孔  print(self.name+'的嘴巴 制作完毕') def makeEar(self):#耳朵大大的print(self.name+'的耳朵 制作完毕') def makeEye(self):#眼睛小小的 print(self.name+'的眼睛 制作完毕') def makeHead(self):#很大的头 print(self.name+'的头 制作完毕') def makeBody(self):#略 print(self.name+'的身体 制作完毕') def makeFoot(self):#略  print(self.name+'的脚 制作完毕') def makeMerge(self):#略  print(self.name+'合并完毕')

在class Pig中,如 makeMoth里面,只加入详细制作猪嘴巴的代码,不要把制作猪头的代码放这里哦你发现,class Pig中 没有了这2段代码,这是因为,如果你继承别的对象,如Animal后,若完全不修改某些方法属性,就可以不写出来(实际还是存在Pig中的)

def __init__(self, name):self.name = name def makeAll(self): # 一条龙。直接跑完整个流水线self.makeMoth()self.makeEar()self.makeEye()self.makeHead()self.makeBody()self.makeFoot()self.makeMerge()

写出来意味着,你要覆盖以前代码块里的行为,如 我们写出了makeMoth,makeEar …

意味着我们要把makeMoth里的制作细节改成我们想要的,

猪和鸭子的嘴巴长得不一样,制作细节肯定不同,对吧?

最后我们用以下代码,让机器开始造猪

pig1 = Pig('猪')  #实例化,相当于怀孕
pig1.makeAll()  # 开始造猪,相当于在子宫里形成整体

现在开始造鸭子的图纸,继承Animal,覆盖某些代码

class Duck(Animal):  # def makeMoth(self):#这里加详细的鸭子嘴巴制作流程,如长嘴巴,嘴巴硬 print(self.name+'的嘴巴 制作完毕') def makeEar(self):#耳朵很小print(self.name+'的耳朵 制作完毕') def makeEye(self):#眼睛小小的 print(self.name+'的眼睛 制作完毕') def makeHead(self):#头很小 print(self.name+'的头 制作完毕') def makeBody(self):#略 print(self.name+'的身体 制作完毕') def makeFoot(self):#略  print(self.name+'的脚 制作完毕')     def makeMerge(self):#略  print(self.name+'合并完毕') def makeWing(self): #增加翅膀的制作流程#略  print(self.name+'的翅膀 制作完毕') def makeAll(self): #因为增加了翅膀,所以要覆写这个函数      self.makeMoth()self.makeEar()self.makeEye()self.makeHead()self.makeBody()self.makeFoot()self.makeWing()  #插入翅膀制作流程self.makeMerge()

然后用以下代码实例化,开始做鸭子

duck1 = Duck('鸭子')
duck1.makeAll()

以后我们要狗、牛、企鹅,都可以从Animal继承, Animal给我们提供了一个框架,我们只需要在这个框架上,扩展,延伸 就可以很方便的做出任何东西,这就是类的魅力。
如果你要做个别的咋办?

可以建立一个 足够通用基类,慢慢扩展, 类似人类的老祖宗,最开始是微生物,后来是猴子

class Weishengwu(object):'''假设一开始的老祖宗只会吃东西'''def __init__(self, name): self.name = name def eat(self):print('吃东西')#开始进化成鱼类class Fish(Weishengwu):'''在老祖宗只会吃的基础上,学会了移动'''def move(self):print('移动')#开始进化成猴子class Houzi(Fish):'''在鱼的基础上学会了爬树'''def __init__(self, name, love):  # 以前只有名字,现在有了爱好,或许是吃桃子、或许是荡秋千self.name = name self.love = love def eat(self):#覆写,因为吃东西的方式可能和鱼类不一样了print('牙齿吃东西')def move(self):#覆写,不是在水里移动了,是陆地上移动print('脚移动')def Pashu(self):print('爬树')#你可以继续进化,继续给他增加任何功能

链接:https://www.zhihu.com/question/27699413/answer/327777872
来源:知乎

如何理解python的类与对象相关推荐

  1. python 类-如何理解python的类与对象?

    挂一个自己的学习笔记 这个时间一长就搞错了,还经常回头来看一看,尤其是self的用法. python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也 ...

  2. Python基础(类与对象)

    Python基础(类与对象) 一.编程的两大思想 面向过程和面向对象 面向过程 面向对象 区别 事物比较简单,可以用线性的思维去解决 事物比较复杂,使用简单的线性思维无法解决 共同点:面向对象和面向过 ...

  3. Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法

    Day09新手小白学python 第九节 Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法 目录 Day09新手小白学python 前言 一.面向对象介绍 二 ...

  4. python iterable对象_如何理解Python中的iterable对象

    转载请注明出处:https://www.jianshu.com/u/5e6f798c903a [^*] 表示注脚,在文末可以查看对应连接,但简书不支持该语法. 首先,容器和 iterable 间没有必 ...

  5. Python基础——类与对象

    Python基础--类与对象 Python基础--类与对象 类与对象 数据类型 对象 类的创建 创建语法 类的创建 对象的创建 对象调用类中的内容 类属性,类方法,静态方法 类属性 访问类属性 类方法 ...

  6. Python的零基础超详细讲解(第十三天)-Python的类与对象

    基础篇往期文章如下: Python的零基础超详细讲解(第一天)-Python简介以及下载 Python的零基础超详细讲解(第二天)-Python的基础语法1 Python的零基础超详细讲解(第三天)- ...

  7. 【Python】Python的类和对象(长文系列第⑤篇)

    系列最后一篇来说说Python中的类与对象,Python这门语言是无处不对象,如果你曾浅要了解过Python,你应该听过Python是一种面向对象编程的语言,所以你经常可能会看到面向"对象& ...

  8. 牛逼!Python的类和对象(长文系列第⑤篇)

    系列最后一篇来说说Python中的类与对象,Python这门语言是无处不对象,如果你曾浅要了解过Python,你应该听过Python是一种面向对象编程的语言,所以你经常可能会看到面向"对象& ...

  9. python类的构造方法名称_搞懂Python的类和对象名称空间

    代码块的分类 python中分几种代码块类型,它们都有自己的作用域,或者说名称空间:文件或模块整体是一个代码块,名称空间为全局范围 函数代码块,名称空间为函数自身范围,是本地作用域,在全局范围的内层函 ...

最新文章

  1. 简述数学建模的过程_数学建模研究过程指导:从高中数学体会数学概貌和数学建模...
  2. 编程之美——买书问题:贪心算法
  3. 【随笔】激活函数是怎样一种存在?
  4. java中Scanner类中 next()与nextLine()的区别
  5. 前端学习(2882):实现视图初始化
  6. windows封装/备份恢复/双系统安装
  7. cocos2d-x 如何制作一个类马里奥的横版平台动作游戏续 2
  8. 微信公众号测试账号获取授权须关注
  9. linux反向连接如何免密码,编写受密码保护的反向Shell(Linux x64)
  10. 编程语言的动态性(Dart和OC对比)
  11. 电脑激活Office时出现异常,激活界面白屏或提示无法与服务器
  12. tao的开源代码_获取并编译TAO
  13. mongodb ubuntu下安装以及开启远程访问
  14. PHP:include包含文件局部引入全局变量失效的作用域问题
  15. 南京微盟最新推出:PD电源六级能效 外推芯片 ME8224AM6G ME8224BM6G SOT23-6
  16. Laravel 7.x - 学习/实践
  17. Linux dirname 命令
  18. 网易云linux字体太小,网易云音乐客户端和百度网盘在Deepin下字体显示太小的解决...
  19. spring boot 设置 wagon 自动打包部署插件在 debug 模式下运行就不打包部署
  20. 牛客2019湘潭大学程序竞赛

热门文章

  1. python实现洗牌算法_洗牌算法及 random 中 shuffle 方法和 sample 方法浅析
  2. 大连理工IIAU Lab提出SSLSOD:自监督预训练的RGB-D显著性目标检测模型(AAAI 22)
  3. AI项目对接第二期——缺陷检测
  4. linux 后台运行jar SpringBoot
  5. cocos2d-js动作的连续
  6. DeepChem | Windows 10下anaconda3环境从源码构建并安装deepchem
  7. 广东海洋大学计算机科学与技术排名,最新排名!广东高校22个学科位居全球前50位...
  8. Galaxy Release_20.09 发布,新增多个数据上传组件
  9. 在线作图|2分钟绘制三维PCA图
  10. 赖江山:生态学研究都在用哪些R包?