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.__属性名即为私有属性)在外界不能被直接访问,在对象的方法内部可以正常访问。
私有方法(在方法名前添加 _)在外界不能直接访问
调用私有属性方法:_类名__属性名
调用私有方法的方法:_类名__方法