类、对象在实际编程中有啥好处,为啥要用它们再给你解释怎么去理解它们
1.类的好处主要有
方便复用(如果你用函数写,就要复制整块代码,增加了代码量,增加了出错率)方便扩展(函数写段代码,若要升级、扩展,都十分复杂,容易出错,用类来扩展,则方便清晰)方便维护(因为类是把抽象的东西映射成我们常见的,摸得到的东西,容易理解,维护也方便)
举几个例子:
比如你是玩具厂的工程师,你要制作一个机器,可以批量制作鸭子形状的玩具,也许你的思路如下:
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就是获取我们传入的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 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('爬树')
#你可以继续进化,继续给他增加任何功能
希望可以帮到你
- 撑了三个月,霉霉抖森分手!期待霉霉新专辑……9月7日,据美国八卦杂志《US WEEKLY》爆料,泰勒·斯威夫特和抖森分手了!报道称,两人分手的原因是抖森希望能够高调地公布恋情,带霉霉参加...
- 世界杯决赛双方首发出炉:姆巴佩PK梅西北京时间12月18日23点,2022世界杯决赛阿根廷将对阵法国,赛前首发信息公布。 法国首发 门将:1-洛里 后卫:5-孔德、4-瓦拉内、18-于帕梅卡诺、...
- 2017:回顾与展望十二月总结是一个神圣的传统。所以我们这就开始吧! 勒索软件 去年的这个时候,我们把2016年称为勒索软件之年,这一年确实出现了形式多样...
- 美加墨合办世界杯却打贸易战 特朗普:让比赛更刺激美国、加拿大和墨西哥将于2026年合办世界杯足球赛,美国总统特朗普星期五(3月7日)宣布成立协助筹办赛事的白宫工作小组时指出,美加墨之...
- 红米手机2A项目 标准版 增强版 高配版 系统 Android 4.4 Android 5.1 界面 可更新至MIUI 9 网络制式 4G:TDD-LTE(B38/B39/B40/B41)3G:TD-SCDMA(B34/B39)2G:GSM(B2/B3/B5/B8)双卡双...
- 2024年11月北京联通宽带价格表(北京联通宽带办理流程)摘要 在北京办理宽带哪个好,便宜又划算的宽带套怎么选,本文提供了北京联通宽带套餐的详细信息,包括不同速率的宽带服务、对应的价格、...
- steam赛车游戏排行榜前十steam赛车游戏排行榜前十 steam赛车游戏排行榜前十合集是一款可以让玩家感受非常逼真的顶级视觉效果合集,并且提供给玩家单人和多人模式,...
- 【Word分数线怎么打】在Word怎么打分数从小我们就不仅仅要学习汉字,还有数字,数字影响着我们的生活,常见于校园里,许多理科老师在备教学PPT时,经常会需要在Word中输入分数,...
- 王者荣耀888点券等于多少钱王者荣耀888点券等于多少钱?很多玩家看到皮肤需要888点劵,都想了解这究竟是多少钱,为此18183小编就为大家来解答下。 问题描述: 王者荣耀...
- 坐骑装备“马匹外形切换”功能: 已装备在马匹装备栏中的“马牌”,“马匹时装”及“玉娇龙”时,所获得所有马匹外形将全部添加至“马匹界面”右...