黑马程序员python基础班教程笔记:(47)self理解

黑马程序员python基础班教程笔记:(47)self理解
黑马程序员python基础班教程笔记:(47)self理解

self

1. 理解self

2. 看如下示例:

总结

所谓的self,可以理解为??

以把self当做C++中类??的this指针?样理解,就是对象?身的意思某个对象调

?其?法时,python 解释器会把这个对象作为第?个参数传 递给self ,所以开发者只需要传递后?的参数即可

应?:烤地?

为了更好的理解?向对象编程,下?以“烤地?”为案例,进?分析

1. 分析“烤地?”的属性和?法 示例属性如下:

cookedLevel : 这是数字;0~3表示还是?的,超过3表示半?不熟,超过 5表示已经烤好了,超过8表示已经烤成?炭了!我们的地?开始时时? 的 cookedString : 这是字符串;描述地?的?熟程度

condiments : 这是地?的配料列表,?如番茄酱、芥末酱等

示例?法如下:

cook() :把地?烤?段时间

addCondiments() : 给地?添加配料 : 设置默认的属性

: 让print 的结果看起来更好?些

定义类,并且定义_init_()?

3. 添加"烤地?"?法

4. 基本的功能已经有了?部分,赶紧测试?下

把上?2块代码合并为?个程序后,在代码的下?添加以下代码进?测试

完成的代码为:

5. 测试cook?法是否好?

在上?的代码最后?添加如下代码:

print("------接下来要进?烤地?了-----")

mySweetPotato.cook(4) #烤4分钟

print(mySweetPotato.cookedLevel)

print(mySweetPotato.cookedString)

定义addCondiments()?法和_str_()方法

def str(self):

msg = self.cookedString + "地?"if

len(self.condiments) >0:

msg = msg + "("

for temp in self.condiments: msg

= msg + temp + ", "

msg = msg.strip(", ")

msg = msg +

")"return msg

def addCondiments(self, condiments):

self.condiments.append(condiments) 7. 再次测试

完整的代码如下:

class SweetPotato:

'这是烤地?的类'

#定义初始化?法

def init(self):

self.cookedLevel = 0

self.cookedString = "?的"

self.condiments =[]

#定制print时的显示内

容def str(self):

msg = self.cookedString + "地?"

if len(self.condiments) > 0:

msg = msg + "("

for temp in self.condiments:

msg = msg + temp + ", "

msg = msg.strip(", ")

msg = msg + ")"

return msg

#烤地??法

def cook(self, time):

self.cookedLevel += time

if self.cookedLevel > 8:

self.cookedString = "烤成灰了"

elif self.cookedLevel > 5:

self.cookedString = "烤好了"

elif self.cookedLevel > 3:

self.cookedString = "半?不熟"

else:

self.cookedString = "?的"

#添加配料

def addCondiments(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. 直接通过对象名修改

SweetPotato.cookedLevel = 5

2. 通过?法间接修改

SweetPotato.cook(5)

分析

明明可以使?第1种?法直接修改,为什么还要定义?法来间接修改呢?

?少有2个原因:

如果直接修改属性,烤地??少需要修改2部分,即修改cookedLevel和cookedString。?使??法来修改时,只需要调??次即可完成如果直接访问属性,可能会出现?些数据设置错误的情况产?例

如cookedLevel = -3 。这会使地??以前还?,当然了这也没有任何意义,通过使??法来进?修改,就可以在?法中进?数据合法性的检查

应?:存放家具

#定义?个home类

class Home:

def init(self,area):

self.area = area #房间剩余的可??积

self.light = 'on' #灯默认是亮的

self.containsItem = []

def str(self):

msg = "当前房间可??积为:"+ str(self.area) if

len(self.containsItem) >0:

msg = msg + "容纳的物品有: "

for temp in self.containsItem:

msg = msg + temp.getName() + ", "msg

= msg.strip(", ")

return msg

#容纳物品

def accommodateItem(self,item):

#如果可??积?于物品的占??积

needArea = item.getUsedArea()

if self.area > needArea:

self.containsItem.append(item)

self.area -= needArea

print("ok:已经存放到房间中")

else:

print("err:房价可??积为:%d,但是当前要存放的物品需要的?积为

#定义bed类

class Bed:

def init(self,area,name ='床'):

https://www.360docs.net/doc/9718303927.html, = name

self.area = area

def str(self):

msg = '床的?积为:' + str(self.area)

return msg

#获取床的占??积

def getUsedArea(self):

return self.area

def getName(self):

return https://www.360docs.net/doc/9718303927.html,

#创建?个新家对象

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)

总结:

如果?个对象与另外?个对象有?定的关系,那么?个对象可?是另外?个对象的属性

思维升华:

添加“开、关”灯,让房间、床?起亮、灭

相关主题
相关文档
最新文档