通过方法获取对象属性
[Python]
纯文本查看
复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class Cat: # 属性 # 方法 def eat(self): print("猫在吃鱼....") def drink(self): print("猫在喝可乐...") def introduce(self): # print("名字是:%s, 年龄是:%d" % (汤姆的名字, 汤姆的年龄)) print("名字是:%s, 年龄是:%d" % (tom.name, tom.age))# 创建了一个对象tom = Cat()# 给对象tom添加了一个属性,叫name,,里面的值是"汤姆"tom.name = "汤姆"tom.age = 30# 调用tom的方法tom.eat()tom.drink()# 直接通过对象获取其属性print(tom.name)print(tom.age)print("-"*30)# 调用tom的方法,在其方法中获取它的属性tom.introduce() |
创建多个对象
[Python]
纯文本查看
复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class Cat: # 属性 # 方法 def eat(self): print("猫在吃鱼....") def drink(self): print("猫在喝可乐...") def introduce(self): # print("名字是:%s, 年龄是:%d" % (汤姆的名字, 汤姆的年龄)) print("名字是:%s, 年龄是:%d" % (tom.name, tom.age))# 创建了一个对象tom = Cat()tom.name = "汤姆"tom.age = 30tom.eat()tom.drink()print(tom.name)print(tom.age)print("-"*30)tom.introduce()print("="*30)# 创建了另外一个对象lan_mao = Cat()lan_mao.name = "蓝猫"lan_mao.age = 20lan_mao.introduce() |
·
通过一个类,可以创建多个对象,就好比
通过一个模具创建多个实体一样
self
使用
self替换方法中的对象名[Python]
纯文本查看
复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class Cat: # 方法 def eat(self): print("猫在吃鱼....") def drink(self): print("猫在喝可乐...") def introduce(self): # print("名字是:%s, 年龄是:%d" % (汤姆的名字, 汤姆的年龄)) # print("名字是:%s, 年龄是:%d" % (tom.name, tom.age)) print("名字是:%s, 年龄是:%d" % (self.name, self.age))# 创建了一个对象tom = Cat()tom.name = "汤姆"tom.age = 30tom.eat()tom.drink()print(tom.name)print(tom.age)print("-"*30)tom.introduce()print("="*30)# 创建了另外一个对象lan_mao = Cat()lan_mao.name = "蓝猫"lan_mao.age = 20lan_mao.introduce() # 相当于lan_mao.introduce(lan_mao) |
一个较为完整的程序
[Python]
纯文本查看
复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | class Cat: # 方法 def eat(self): print("%s在吃鱼...." % self.name) # 这里换成self def drink(self): print("%s在喝可乐..." % self.name) # 这里换成self def introduce(self): # print("名字是:%s, 年龄是:%d" % (汤姆的名字, 汤姆的年龄)) # print("名字是:%s, 年龄是:%d" % (tom.name, tom.age)) print("名字是:%s, 年龄是:%d" % (self.name, self.age))# 创建了一个对象tom = Cat()tom.name = "汤姆"tom.age = 30tom.eat()tom.drink()print(tom.name)print(tom.age)print("-"*30)tom.introduce()print("="*30)# 创建了另外一个对象lan_mao = Cat()lan_mao.name = "蓝猫"lan_mao.age = 20lan_mao.introduce() # 相当于lan_mao.introduce(lan_mao)lan_mao.eat()lan_mao.drink() |
总结
·
所谓的
self,可以理解为自己·
可以把
self当做C++中类里面的this指针一样理解,就是对象自身的意思·
某个对象调用其方法时,
python解释器会把这个对象作为第一个参数传递给self,所以开发者只需要传递后面的参数即可· self仅仅是一个变量名,也可将self换为其他任意的名字,但是为了能够让其他开发人员能明白这变量的意思,因此一般都会self当做名字
__init__()方法
[Python]
纯文本查看
复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | class Cat: # 方法 def __init__(self, new_name, new_age): """在创建完对象之后 会自动调用, 它完成对象的初始化的功能""" # self.name = "汤姆" # 如果这里写"汤姆"的话,只要是用这个Cat创建的任何对象,都叫做“汤姆”,因此不能使用 # self.age = 20 self.name = new_name self.age = new_age def eat(self): print("%s在吃鱼...." % self.name) def drink(self): print("%s在喝可乐..." % self.name) def introduce(self): # print("名字是:%s, 年龄是:%d" % (汤姆的名字, 汤姆的年龄)) # print("名字是:%s, 年龄是:%d" % (tom.name, tom.age)) print("名字是:%s, 年龄是:%d" % (self.name, self.age))# 创建了一个对象tom = Cat("汤姆", 30) # "汤姆", 30这2个参数会自动传递到__init__方法中# 给对象tom添加了一个属性,叫name,,里面的值是"汤姆"# tom.name = "汤姆"# tom.age = 30tom.eat()tom.drink()print(tom.name)print(tom.age)print("-"*30)tom.introduce() # 相当于tom.introduce(tom)print("="*30)lan_mao = Cat("蓝猫", 20)# lan_mao.name = "蓝猫"# lan_mao.age = 20lan_mao.introduce() # 相当于lan_mao.introduce(lan_mao)lan_mao.eat()lan_mao.drink() |
总结
· __init__()方法,在创建一个对象时默认被调用,不需要手动调用
· __init__(self)
中,默认有
1个参数名字为self,如果在创建对象时传递了2个实参,那么__init__(self)中出了
self作为第一个形参外还需要2个形参,例如__init__(self,x,y)· __init__(self)
中的
self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递进去__str__()方法
1. 打印id()
如果把
BMW使用print进行输出的话,会看到如下的信息即看到的是创建出来的
BMW对象在内存中的地址2. 定义
__str__()
方法
[Python]
纯文本查看
复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class Cat: """定义一个猫类""" def __init__(self, new_name, new_age): """在创建完对象之后 会自动调用, 它完成对象的初始化的功能""" # self.name = "汤姆" # self.age = 20 self.name = new_name self.age = new_age # 它是一个对象中的属性,在对象中存储,即只要这个对象还存在,那么这个变量就可以使用 # num = 100 # 它是一个局部变量,当这个函数执行完之后,这个变量的空间就没有了,因此其他方法不能使用这个变量 def __str__(self): """返回一个对象的描述信息""" # print(num) return "名字是:%s , 年龄是:%d" % (self.name, self.age) def eat(self): print("%s在吃鱼...." % self.name) def drink(self): print("%s在喝可乐..." % self.name) def introduce(self): # print("名字是:%s, 年龄是:%d" % (汤姆的名字, 汤姆的年龄)) # print("名字是:%s, 年龄是:%d" % (tom.name, tom.age)) print("名字是:%s, 年龄是:%d" % (self.name, self.age))# 创建了一个对象tom = Cat("汤姆", 30)print(tom) |
总结
·
在
python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做
“魔法”方法·
当使用
print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中
return的数据· __str__方法需要返回一个字符串,当做这个对象的描写
应用
:烤地瓜为了更好的理解面向对象编程,下面以
“烤地瓜”为案例,进行分析1. 分析“烤地瓜”的属性和方法
示例属性如下
:· cookedLevel : 这是数字;0~3表示还是生的,超过3表示半生不熟,超过5表示已经烤好了,超过8表示已经烤成木炭了!我们的地瓜开始时时生的
· cookedString : 这是字符串;描述地瓜的生熟程度
· condiments : 这是地瓜的配料列表,比如番茄酱、芥末酱等
示例方法如下
:· cook() : 把地瓜烤一段时间
· addCondiments() : 给地瓜添加配料
· __init__() : 设置默认的属性
· __str__() : 让print的结果看起来更好一些
2. 定义类,并且定义
__init__()
方法
[Python]
纯文本查看
复制代码
1 2 3 4 5 6 7 | #定义`地瓜`类class SweetPotato: '这是烤地瓜的类' #定义初始化方法 def __init__(self): self.cookedLevel = 0 self.cookedString = "生的" self.condiments = [] |
3. 添加"烤地瓜"方法
[Python]
纯文本查看
复制代码
01 02 03 04 05 06 07 08 09 10 | #烤地瓜方法[/align] 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 = "生的" |
4. 基本的功能已经有了一部分,赶紧测试一下
把上面
2块代码合并为一个程序后,在代码的下面添加以下代码进行测试[Python]
纯文本查看
复制代码
1 2 3 4 | mySweetPotato = SweetPotato()print(mySweetPotato.cookedLevel)print(mySweetPotato.cookedString)print(mySweetPotato.condiments) |
完整的代码为
:[Python]
纯文本查看
复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 | class SweetPotato: '这是烤地瓜的类' #定义初始化方法 def __init__(self): self.cookedLevel = 0 self.cookedString = "生的" self.condiments = [] #烤地瓜方法 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 = "生的" |
# 用来进行测试
[Python]
纯文本查看
复制代码
1 2 3 4 | mySweetPotato = SweetPotato()print(mySweetPotato.cookedLevel)print(mySweetPotato.cookedString)print(mySweetPotato.condiments) |
5. 测试cook方法是否好用
在上面的代码最后面添加如下代码
:[Python]
纯文本查看
复制代码
1 2 3 4 | print("------接下来要进行烤地瓜了-----")mySweetPotato.cook(4) #烤4分钟print(mySweetPotato.cookedLevel)print(mySweetPotato.cookedString) |
6. 定义
addCondiments()
方法和
__str__()
方法
[Python]
纯文本查看
复制代码
01 02 03 04 05 06 07 08 09 10 | def __str__(self):[/align] 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. 再次测试
完整的代码如下
:[Python]
纯文本查看
复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | 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) |
应用
:存放家具[Python]
纯文本查看
复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #定义一个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,但是当前要存放的物品需要的面积为%d"%(self.area, needArea))#定义bed类class Bed: def __init__(self,area,name = '床'): self.name = name self.area = area def __str__(self): msg = '床的面积为:' + str(self.area) return msg #获取床的占用面积 def getUsedArea(self): return self.area def getName(self): return self.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) |
总结:
· 如果一个对象与另外一个对象有一定的关系,那么一个对象可用是另外一个对象的属性
思维升华:
·
添加
“开、关”灯,让房间、床一起亮、灭更多免费技术资料可关注:annalin1203