python学习第四天

1.__del__方法

class Cat():
    def __init__(self,new_name):
        self.name = new_name
        print("%s 来了"%self.name)
        #在对象离开之前最后一次被自动调用
    def __del__(self):
        print("% s 我去了"%self.name)
tom = Cat("Tom")
print(tom.name)
print("-"*50)

输出结果:

Tom 来了
Tom
--------------------------------------------------
Tom 我去了

2.str__方法;在使用print输出对象时,希望打印出自定义内容,可以使用__str,__str__必须返回一个字符串(return)

class Cat():
    def __init__(self,new_name):
        self.name = new_name
        print("%s 来了"%self.name)
        #在对象离开之前最后一次被自动调用
    def __del__(self):
        print("% s 我去了"%self.name)
    def __str__(self):
        #必须返回一个字符串
        return "我是小猫[%s]"%self.name
tom = Cat("Tom")
print(tom)
print("-"*50)

输出结果:

Tom 来了
我是小猫[Tom]
--------------------------------------------------
Tom 我去了

面向对象封装实例

封装:将属性和方法封装到类中,外界使用类创建对象并让对象调用方法。

例1:家具摆放

实现功能:
(1)房子户型、家具、总面积
(2)家具名字及占地面积
(3)将家具添加到房子中
(4)要求输出:户型、总面积、剩余面积、家具名称列表

class Hourseitem:
    def __init__(self, name, item_area):
        self.name = name
        self.area = item_area
    def __str__(self):
        return  "家具的名字是 %s ,面积是 %.2f "%(self.name,self.area)


class Hourse:
    #只有需要从外界获取的参数才将其设置为初始化的形参,
    # 其余参数在内部定义
    def __init__(self,hourse_type,area):
        self.house_type = hourse_type
        self.area = area
        #初始剩余面积等于总面积,初始家具列表为空,在函数内部定义,无需从外界获得
        self.free_area = area
        self.item_list = []
    def __str__(self):
        #__str_返回输出的是上面由__init__定义的对象属性
        #代码过长时,用()把代码括起来,python 可以将一个括号内的代码连续到一起
        return ("户型:%s\n面积:%.2f\n剩余面积:%.2f\n家具:%s"
                %(self.house_type,self.area,self.free_area,
                  self.item_list))
    def add_item(self,item):
        print("要添加%s"%item)
        #1判断家具面积
        if item.area > self.free_area:
            print("%s的面积太大了,无法添加"%item.name)
            return
        #2将家具添加到列表中
        self.item_list .append(item.name)
        print("添加%s到房子中"%item.name)
        #3计算剩余面积
        self.free_area -= item.area
        print("剩余面积%.2f"%self.free_area)


#创建家具
#使添加家具的面积大于房屋面积,查看输出结果
bed = Hourseitem("席梦思",97)
chest = Hourseitem("衣柜",2)
table = Hourseitem("餐桌",1.5)
print(bed)
print(chest)
print(table)
#创建房子对象
my_home = Hourse("两室一厅",100)
my_home.add_item(bed)
my_home.add_item(chest)
my_home.add_item(table)
print(my_home)

输出结果:

家具的名字是 席梦思 ,面积是 97.00 
家具的名字是 衣柜 ,面积是 2.00 
家具的名字是 餐桌 ,面积是 1.50 
要添加家具的名字是 席梦思 ,面积是 97.00 
添加席梦思到房子中
剩余面积3.00
要添加家具的名字是 衣柜 ,面积是 2.00 
添加衣柜到房子中
剩余面积1.00
要添加家具的名字是 餐桌 ,面积是 1.50 
餐桌的面积太大了,无法添加
户型:两室一厅
面积:100.00
剩余面积:1.00
家具:['席梦思', '衣柜']

例2:士兵突击

实现功能:
(1)士兵许三多有一把AK47
(2)士兵可以开火
(3)枪能够发射子弹
(4)枪装填子弹
在定义属性时,一个对象的属性可以是另一个类定义的对象。
身份运算符:is,not is
比较两个变量内存地址是否相同:a is b;a is not b
is 与区别:
is 判断两个引用的变量是否相同,即变量地址是否相同,而
用来判断两个变量值是否相等。

#一个对象的类可以是另一个对象的属性
class Gun:
    def __init__(self,model):
        self.model = model
        self.bullet_count = 0
    def __str__(self):
        return "型号:%s\n子弹数量:%d"%(self.model,self.bullet_count)
    def add_bullet(self,count):
        print("添加%d颗子弹"%count)
        self.bullet_count += count
    def shoot(self):
        #1 判断子弹数量
        if self.bullet_count <= 0:
            print("[%s]子弹数量不足,请填充子弹"%self.model)
            return
        #2 发射子弹
        self.bullet_count -= 1
        #3 提示发射信息
        print("[%s]射击子弹,剩余子弹数量%d"%(self.model,self.bullet_count))


class Solider:
    def __init__(self,name):
        #姓名
        self.name = name
        #枪-假设新兵没有枪,不能使用枪对象对枪属性进行赋值,
        # 使用None,即定义属性,也不使用枪对象
        self.gun = None
    def fire(self):
         #判断士兵是否有枪
        if self.gun == None:
            print("【%s】还没有枪"%self.name)
            return
         #喊口号
        print("冲啊。。。")
         #让枪装子弹
        self.gun.add_bullet(5)
         #让枪发射子弹
        self.gun.shoot()
gun = Gun("AK47")
xusanduo = Solider("许三多")
xusanduo.gun = gun
xusanduo.fire()
print(xusanduo.gun)

输出结果:

冲啊。。。
添加5颗子弹
[AK47]射击子弹,剩余子弹数量4
型号:AK47
子弹数量:4

私有属性(将self.属性名改为self.__属性名即为私有属性)在外界不能被直接访问,在对象的方法内部可以正常访问。
私有方法(在方法名前添加 _)在外界不能直接访问
调用私有属性方法:_类名__属性名
调用私有方法的方法:_类名__方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值