您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 招聘面试 > 黑马程序员python基础班教程笔记:(47)self理解
self1.理解self2.看如下示例:总结所谓的self,可以理解为⾃⼰以把self当做C++中类⾥⾯的this指针⼀样理解,就是对象⾃身的意思某个对象调init()⽤其⽅法时,python解释器会把这个对象作为第⼀个参数传递给self,所以开发者只需要传递后⾯的参数即可应⽤:烤地⽠为了更好的理解⾯向对象编程,下⾯以“烤地⽠”为案例,进⾏分析1.分析“烤地⽠”的属性和⽅法示例属性如下:cookedLevel:这是数字;0~3表示还是⽣的,超过3表示半⽣不熟,超过5表示已经烤好了,超过8表示已经烤成⽊炭了!我们的地⽠开始时时⽣的cookedString:这是字符串;描述地⽠的⽣熟程度condiments:这是地⽠的配料列表,⽐如番茄酱、芥末酱等示例⽅法如下:cook():把地⽠烤⼀段时间addCondiments():给地⽠添加配料:设置默认的属性:让print的结果看起来更好⼀些定义类,并且定义_init_()⽅法str()3.添加烤地⽠⽅法4.基本的功能已经有了⼀部分,赶紧测试⼀下把上⾯2块代码合并为⼀个程序后,在代码的下⾯添加以下代码进⾏测试完成的代码为:5.测试cook⽅法是否好⽤在上⾯的代码最后⾯添加如下代码:print(------接下来要进⾏烤地⽠了-----)mySweetPotato.cook(4)#烤4分钟print(mySweetPotato.cookedLevel)print(mySweetPotato.cookedString)定义addCondiments()⽅法和_str_()方法defstr(self):msg=self.cookedString+地⽠iflen(self.condiments)0:msg=msg+(fortempinself.condiments:msg=msg+temp+,msg=msg.strip(,)msg=msg+)returnmsgdefaddCondiments(self,condiments):self.condiments.append(condiments)7.再次测试完整的代码如下:classSweetPotato:'这是烤地⽠的类'#定义初始化⽅法definit(self):self.cookedLevel=0self.cookedString=⽣的self.condiments=[]#定制print时的显示内容defstr(self):msg=self.cookedString+地⽠iflen(self.condiments)0:msg=msg+(fortempinself.condiments:msg=msg+temp+,msg=msg.strip(,)msg=msg+)returnmsg#烤地⽠⽅法defcook(self,time):self.cookedLevel+=timeifself.cookedLevel8:self.cookedString=烤成灰了elifself.cookedLevel5:self.cookedString=烤好了elifself.cookedLevel3:self.cookedString=半⽣不熟else:self.cookedString=⽣的#添加配料defaddCondiments(self,condiments):self.condiments.append(condiments)#⽤来进⾏测试mySweetPotato=SweetPotato()print(------有了⼀个地⽠,还没有烤-----)print(mySweetPotato.cookedLevel)print(mySweetPotato.cookedString)print(mySweetPotato.condiments)print(------接下来要进⾏烤地⽠了-----)print(------地⽠经烤了4分钟-----)mySweetPotato.cook(4)#烤4分钟print(mySweetPotato)print(------地⽠⼜经烤了3分钟-----)mySweetPotato.cook(3)#⼜烤了3分钟print(mySweetPotato)print(------接下来要添加配料-番茄酱------)mySweetPotato.addCondiments(番茄酱)print(mySweetPotato)print(------地⽠⼜经烤了5分钟-----)mySweetPotato.cook(5)#⼜烤了5分钟print(mySweetPotato)print(------接下来要添加配料-芥末酱------)mySweetPotato.addCondiments(芥末酱)print(mySweetPotato)隐藏数据可能你已经意识到,查看过着修改对象的属性(数据),有2种⽅法1.直接通过对象名修改2.通过⽅法间接修改分析明明可以使⽤第1种⽅法直接修改,为什么还要定义⽅法来间接修改呢?⾄少有2个原因:如果直接修改属性,烤地⽠⾄少需要修改2部分,即修改cookedLevel和cookedString。⽽使⽤⽅法来修改时,只需要调⽤⼀次即可完成如果直接访问属性,可能会出现⼀些数据设置错误的情况产⽣例如cookedLevel=-3。这会使地⽠⽐以前还⽣,当然了这也没有任何意义,通过使⽤⽅法来进⾏修改,就可以在⽅法中进⾏数据合法性的检查应⽤:存放家具#定义⼀个home类classHome:definit(self,area):SweetPotato.cookedLevel=5SweetPotato.cook(5)self.area=area#房间剩余的可⽤⾯积self.light='on'#灯默认是亮的self.containsItem=[]defstr(self):msg=当前房间可⽤⾯积为:+str(self.area)iflen(self.containsItem)0:msg=msg+容纳的物品有:fortempinself.containsItem:msg=msg+temp.getName()+,msg=msg.strip(,)returnmsg#容纳物品defaccommodateItem(self,item):#如果可⽤⾯积⼤于物品的占⽤⾯积needArea=item.getUsedArea()ifself.areaneedArea:self.containsItem.append(item)self.area-=needAreaprint(ok:已经存放到房间中)else:print(err:房价可⽤⾯积为:%d,但是当前要存放的物品需要的⾯积为#定义bed类classBed:definit(self,area,name='床'):self.name=nameself.area=areadefstr(self):msg='床的⾯积为:'+str(self.area)returnmsg#获取床的占⽤⾯积defgetUsedArea(self):returnself.areadefgetName(self):returnself.name#创建⼀个新家对象newHome=Home(100)#100平⽶print(newHome)#创建⼀个床对象newBed=Bed(20)print(newBed)#把床安放到家⾥newHome.accommodateItem(newBed)print(newHome)#创建⼀个床对象newBed2=Bed(30,'席梦思')print(newBed2)#把床安放到家⾥newHome.accommodateItem(newBed2)print(newHome)总结:如果⼀个对象与另外⼀个对象有⼀定的关系,那么⼀个对象可⽤是另外⼀个对象的属性思维升华:添加“开、关”灯,让房间、床⼀起亮、灭
本文标题:黑马程序员python基础班教程笔记:(47)self理解
链接地址:https://www.777doc.com/doc-4210754 .html