Python面向对象 (2)

##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分钟,烤糊了,调料是番茄酱,辣椒酱,芥末
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值