##Python面向对象
1、关于__str__()方法
这个方法是一个魔法方法 (Magic Method) ,用来显示信息
该方法需要 return 一个数据,并且只有self一个参数,当在类的外部 print(对象) 则打印这个数据
当类的实例化对象如果没有__str__() 则默认打印 对象在内存的地址。如果拥有__str__()方法后,那么打印对象则打印__str__()的返回值。
查看类的文档说明,也就是类的注释:
print(Hero.__doc__)
class Hero(object):
"""定义了一个英雄类,可以移动和攻击"""
def __init__(self, name, skill, hp, atk, armor):
""" __init__() 方法,用来做变量初始化或赋值操作"""
# 英雄名
self.name = name # 实例变量
# 技能
self.skill = skill
# 生命值
self.hp = hp # 实例变量
# 攻击力
self.atk = atk
# 护甲值
self.armor = armor
def move(self):
"""实例方法"""
print("%s 正在前往事发地点..." % self.name)
def attack(self):
"""实例方法"""
print("发出了一招强力的%s..." % self.skill)
def __str__(self):
"""
这个方法是一个魔法方法 (Magic Method) ,用来显示信息
该方法需要 return 一个数据,并且只有self一个参数,当在类的外部 print(对象) 则打印这个数据
"""
return "英雄【%s】的数据: 生命值 %d, 攻击力 %d, 护甲值 %d" % (self.name, self.hp, self.atk, self.armor)
taidamier = Hero("泰达米尔", "旋风斩", 2600, 450, 200)
gailun = Hero("盖伦", "大宝剑", 4200, 260, 400)
# 如果没有__str__ 则默认打印 对象在内存的地址。
# 当类的实例化对象 拥有 __str__ 方法后,那么打印对象则打印 __str__ 的返回值。
print(taidamier) # 英雄【泰达米尔】的数据: 生命值 2600, 攻击力 450, 护甲值 200
print(gailun) # 英雄【盖伦】的数据: 生命值 4200, 攻击力 260, 护甲值 400
# 查看类的文档说明,也就是类的注释
print(Hero.__doc__) # 定义了一个英雄类,可以移动和攻击
在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做“魔法”方法。
当使用print输出对象的时候,默认打印对象的内存地址。如果类定义了__str__(self)方法,那么就会打印从在这个方法中 return 的数据。
__str__方法通常返回一个字符串,作为这个对象的描述信息。
2、关于__del__()方法
创建对象后,python解释器默认调用__init__()方法;
当删除对象时,python解释器也会默认调用一个方法,这个方法为__del__()方法。
class Hero(object):
# 初始化方法
# 创建完对象后会自动被调用
def __init__(self, name):
print('__init__方法被调用')
self.name = name
# 当对象被删除时,会自动被调用
def __del__(self):
print("__del__方法被调用")
print("%s 被 GM 干掉了..." % self.name)
# 创建对象
taidamier = Hero("泰达米尔")
# 删除对象
print("%d 被删除1次" % id(taidamier))
del(taidamier)
print("--" * 10)
gailun = Hero("盖伦")
gailun1 = gailun
gailun2 = gailun
print("%d 被删除1次" % id(gailun))
del(gailun)
print("%d 被删除1次" % id(gailun1))
del(gailun1)
print("%d 被删除1次" % id(gailun2))
del(gailun2)
'''
输出结果
__init__方法被调用
139881105243440 被删除1次
__del__方法被调用
泰达米尔 被 GM 干掉了...
--------------------
__init__方法被调用
139881105242488 被删除1次
139881105242488 被删除1次
139881105242488 被删除1次
__del__方法被调用
盖伦 被 GM 干掉了...
'''
当有变量保存了一个对象的引用时,此对象的引用计数就会加1;
当使用del() 删除变量指向的对象时,则会减少对象的引用计数。如果对象的引用计数不为1,那么会让这个对象的引用计数减1,当对象的引用计数为0的时候,则对象才会被真正删除(内存被回收)。
3、面向对象实例:烤地瓜
目标
强化面向对象编程的设计能力,进一步理解类、属性、方法的构建场景
强化对self的理解,方法中使用self可以获取和修改属性
烤地瓜规则:
1.地瓜有自己的状态,默认是生的,地瓜可以进行烧烤
2地瓜有自己烧烤的总时间,由每次烧烤的时间累加得出
3.地瓜烧烤时,需要提供本次烧烤的时间
4.地瓜烧烤时,地瓜状态随着烧烤总时间的变化而改变: [0, 3)生的、[3, 6)半生不熟、[6, 8)熟了、>=8烤糊了
5.输出地瓜信息时,可以显示地瓜的状态和烧烤的总时间
# 新型一个新型类SweetPotato
class SweetPotato(object):
'''
烤地瓜的文档说明
'''
# 初始化属性CookeLevel(一共烤的时间),CookedString(地瓜状态),Condiments(调料列表)
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 = '生的'
# 添加调料的方法
def add_condiments(self,condiments):
self.Condiments.append(condiments)
# print的输出信息
def __str__(self):
if len(self.Condiments) > 0:
str_Condiments = ','.join(self.Condiments) # 列表转字符串
return '地瓜烤了%d分钟,%s,调料是%s' % (self.CookedLevel,self.CookedString,str_Condiments)
else:
return '地瓜烤了%d分钟,%s,没有调料' % (self.CookedLevel, self.CookedString)
print(SweetPotato.__doc__) # 查看类的文档说明:烤地瓜的文档说明
mysweetpotao = SweetPotato() # 实例化一个对象
mysweetpotao.cook(2)
print(mysweetpotao) # 地瓜烤了2分钟,生的,没有调料
mysweetpotao.cook(2)
mysweetpotao.add_condiments('番茄酱')
print(mysweetpotao)# 地瓜烤了4分钟,烤的半生不熟,调料是番茄酱
mysweetpotao.cook(3)
mysweetpotao.add_condiments('辣椒酱')
print(mysweetpotao) # 地瓜烤了7分钟,烤好了,调料是番茄酱,辣椒酱
mysweetpotao.cook(2)
mysweetpotao.add_condiments('芥末')
print(mysweetpotao) #地瓜烤了9分钟,烤糊了,调料是番茄酱,辣椒酱,芥末