【Python基础入门系列】第10天:Python 类与对象

   首先,我已经假定你是个萌新或已经看了无数遍的垃圾文章,然后依然搞不懂类和对象,但是呢起码知道有类和对象这么两个玩意儿,我觉得有必要找一篇生动形象的示例来讲解。

由于你可能没有编程经验,

所以无法从学过的编程语言里通过类比去理解Python的‘类和对象’。咱们用生活中的例子来说说:

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


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() #合并猪的各个部位,组装成最终猪
 

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

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

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

  

 等等 我先说说

 

  1. 类、对象在实际编程中有啥好处,为啥要用它们

  2. 再给你解释怎么去理解它们

 

   类的好处主要有

  • 方便复用(如果你用函数写,就要复制整块代码,增加了代码量,增加了出错率)

  • 方便扩展(函数写段代码,若要升级、扩展,都十分复杂,容易出错,用类来扩展,则方便清晰)

  • 方便维护(因为类是把抽象的东西映射成我们常见的,摸得到的东西,容易理解,维护也方便)

 

 

    举几个例子理解:

类就像是基因的制造图纸,我们人类,生的小孩,也是两只手,两只脚,一个嘴巴,除非变异,否则不会多出一只脚的,之所以这样有序的发展,是因为我们身体里,有基因这张图纸控制着我们的繁衍


现在我们给上面例子中的制作 鸭子、猪 建立一个通用的制作基因表,利用他们相似制作流程 

建立基因表


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('爬树')#你可以继续进化,继续给他增加任何功

 

总结

希望可以通过这个生动而形象的示例,帮到你懂得 Python 类与对象的定义和使用。最后再给你个生动形象的比喻,希望你能理解。

    类(class): 相当于施工图纸(blueprint)

    对象(object):房子(已经建造好的)

 

参考:

https://www.runoob.com/python3/python3-namespace-scope.html

https://www.zhihu.com/search?type=content&q=python%E4%B8%8E%E5%AF%B9%E8%B1%A1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字电子技术课程设计之基于触发器的三位二进制同步减法计数器无效态000/110

基于触发器的三位二进制同步减法计数器无效态000/110 1 课程设计的目的与作用 掌握用multisim 的电路仿真程序 熟悉同步计数器工作原理和逻辑功能 熟悉计数器电路的分析和设计方法 掌握161 芯片集联成任意进制同步加法计数器 2 设计任务 三位二进制减法计数器(无…

【Python的黑魔法】实例方法、静态方法和类方法

class Bird:# classmethod修饰的方法是类方法classmethoddef fly (cls):print(类方法fly: ,cls)# staticmethod修饰的方法是静态方法# staticmethoddef info (p):print(静态方法info: , p)if __name__ __main__:# 调用类方法,Bird类会自动绑定到第一个参数Bird.fl…

基于dreamweaver软件设计和开发一网站_基于 abp vNext 和 .NET Core 开发博客项目 Blazor 实战系列(一)...

系列文章使用 abp cli 搭建项目给项目瘦身,让它跑起来完善与美化,Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API,包装返回模型再说Swagger,分组、描述、小绿锁接入GitHub,用JWT保护你的API异常处理和…

LINUX 内存使用情况

# free 显示结果如下: Mem:表示物理内存统计 total 内存总数 8057964KBused 已使用的内存 7852484KBfree 空闲的内存数 205480KBshared 当前已经废弃不用,总是0buffers Buffer 缓存内存数: 290432KBcached Page 缓存内存数:5735024KB(存在关…

vagrant系列教程(四):vagrant搭建redis与redis的监控程序redis-stat(转)

阅读目录 下载redis解压redis编译安装redis配置redisredis开机自启动系统参数的调整上一篇php7环境的搭建 真是火爆,仅仅两天时间,就破了我之前swagger系列的一片文章,看来,大家对搭建环境真是情有独钟。 为了访问量,我…

【技术分享】Ubuntu下使用微信教程

做后端开发的同学用的Linux(ubuntu),肯定会因为没有适配微信版本会感觉不太舒服,很多时候因为缺少一些办公通讯软件而感到不便。现在已经有很方便的Wine WeChat方案,但是微信在Wine上配置还有许多bug,今天在github上看…

python join函数_Python join()函数

原博文 2016-08-12 10:16 − 今天写python 100例时,有个题目是大致是这样的:已知输入形式是1321,要求输出形式为1123 一开始思路是将输入的字符串用split()函数划分成数组,在对数组进行排序,再用for循环输出 代码附上&…

CSS中的盒子

盒子 盒子模型解释元素在页面中显示成一个方块,类似一个盒子,CSS盒子模型就是使用现实中盒子来做比喻,帮助我们设置元素对应的样式。盒子模型示意图如下: 把元素叫做盒子,设置对应的样式分别为:盒子的边框…

Djang重新整理migrations,解决:Django Table xxx already exist

在开发过程中,由于需求变更或者自我重构,需要清理migrations,以保持代码整洁和后续的可维护性。 场景一 不考虑数据库数据表,可以完全清空数据库里面的表的数据。 步骤: 删除所有migrations find . -path "/migr…

安全随笔2:对称加密应用场景

MD5或者说HASH值是一种不可逆的算法。如果需要从密文还原成明文,那么就需要对称和非对称这两类可逆算法。 首先,简单介绍下这两类算法。图9-1是对称算法的示意图: 图9-1 对称算法 在对称算法中,首先需要发送方和接收方协定一个密钥…

python安装多久_python安装与使用

1、进入官网下载python软件 python-3.4.4.amd64.msi http://www.python.org/download/ 这个软件包含三个环境,如下图:2、双击安装软件 3、设置环境变量path";C:\Python34"; 4、验证是否安装成功 进入cmd中,输入python,如果出现如下…

CSS中的块元素,内联元素,内联块元素

块元素,内联元素,内联块元素 元素就是标签,布局中常用的有三种标签,块元素、内联元素、内联块元素,了解这三种元素的特性,才能熟练的进行页面布局。 块元素块元素,也可以称为行元素,布局中常用的标签如&…

django 与 vue 的完美结合

最近接到一个任务,就是用django后端,前段用vue,做一个普通的简单系统,我就是一搞后端的,听到vue也是比较震惊,之前压根没接触过vue。看了vue的一些文档,还有一些项目,先说一下django…

东芝确定半导体重组计划:保留闪存其他全卖

会计丑闻给日本东芝公司的业绩带来严重影响,为了提高盈利,东芝正在对旗下的半导体、个人电脑、白色家电等业务进行一次重大重组。据日经新闻1月23日报道,东芝已经正式制定了芯片业务重组的详细计划,除了占据优势的闪存芯片之外&am…

python画两条曲线图_python绘制多个曲线的折线图

这篇文章利用的是matplotlib.pyplot.plot的工具来绘制折线图,这里先给出一个段代码和结果图: # -*- coding: UTF-8 -*- import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt #这里导入你自己的数据 #...... #...... #x_axix&a…

oracle 截取字指定的字符串

过滤指定的字符串,一字符串有重复的数据内容,所以需要去掉重复的内容,subst()截取 起止下标;instr()获取终止下标位置 例如:substr(p.address, 0, instr(p.address, -, 1, 1)-1) ); case when length(substr(p.address, 0, instr(p.address, -, 1, 1)-1) ) 13 then substr(sub…

数据分级分类实施指南_运营商行业数据安全治理实践

建立组织构建大数据安全保障组一、大数据安全保障工作组职责 1、负责制定大数据信息安全策略,明确信息安全目标。 2、组织相关平台负责人定期召开信息安全会议。 3、负责客户数据安全突发事件应急方案实施和大数据信息系统日常安全运行管理的组织协调及决策工作。 4…

servlet中中文正常显示,mysql数据库手动插入中文正常显示,servlet向mysql中插入中文显示乱码...

作者:http://5563447.blog.51cto.com/5553447/1422627 问题是:就是POST请求提交表单数据给servlet,通过JDBC插入Mysql,出现中文乱码。 解决方式:在url后面加这句 ?useUnicodetrue&characterEncodingutf-8 我的项目: 结果&am…

垃圾回收算法_垃圾回收算法有哪些

垃圾检测通常通过建立一个根对象的集合以及建立一个从这些根对象开始能够触及的对象集合来实现。如果正在执行的程序可以访问到根对象和某个对象之间存在引用路径,这个对象就是可触及的。对于程序来说,根对象总是可以访问的。从这些根对象开始&#xff0…

不错的电子书下载网站

为什么80%的码农都做不了架构师?>>> www.jb51.net 电子书质量不错,虽然是扫描版的,但是都是高清的. vdisk.weibo.com 网盘, 内容很多! 转载于:https://my.oschina.net/GMT/blog/1188971