(1)把属性和方法封装到类中,在外界使用类创建对象,再让对象调用方法。
(2)同一个类创建的对象之间,属性互不干扰。
小明体重75.0公斤,小妹45.0公斤。每次跑步会减肥0.5公斤。每次吃饭会增重1公斤。
class Person:
def __init__(self, name, weight):
self.name = name
self.weight = weight
def eat(self):
self.weight += 1
def run(self):
self.weight -= 0.5
def __str__(self):
return "%s 现在的体重是 %f 公斤" % (self.name, self.weight)
xiaoming = Person("xiaoming", 75.0)
xiaoming.eat()
xiaoming.eat()
xiaoming.run()
xiaomei =Person("xiaomei", 45.0)
xiaomei.eat()
xiaomei.run()
print(xiaoming)
print(xiaomei)
输出:
xiaoming 现在的体重是 76.500000 公斤
xiaomei 现在的体重是 45.500000 公斤
房子有户型、总面积和家具名称列表三个属性。家具有床、衣柜和餐桌。将三种家具添加到新房子中。
# 创建家具类
class HouseItem:
def __init__(self, name, area):
self.name = name
self.area = area
# 创建房子类
class House:
def __init__(self, house_type, area ):
self.house_type = house_type
self.area = area
self.free_area = area
self.item_list = []
def add_item(self, item):
if item.area > self.free_area:
print("无法添加%s,房屋剩余面积不足" % item.name)
else:
self.item_list.append(item.name)
self.free_area -= item.area
print("加入了1个占地 %f 的 %s" % (item.area, item.name))
def __str__(self):
return ("房子户型是 %s,总面积 %.2f 平米,添加的家具有 %s, 剩余面积 %.2f 平米"
% (self.house_type, self.area, self.item_list, self.free_area))
house = House("两室一厅", 120)
chest = HouseItem("衣柜", 20)
table = HouseItem("餐桌", 10)
bed = HouseItem("床", 100)
house.add_item(chest)
house.add_item(table)
house.add_item(bed)
print(house)
输出:
加入了1个占地 20.000000 的 衣柜
加入了1个占地 10.000000 的 餐桌
无法添加床,房屋剩余面积不足
房子户型是 两室一厅,总面积 120.00 平米,添加的家具有 ['衣柜', '餐桌'], 剩余面积 90.00 平米
士兵许三多有一把AK47,士兵可以开火,枪能够发射子弹,枪装填子弹可以增加子弹数量。
一个类创建的对象[AK47],可以当作另一个类[士兵]的属性。
# 定义枪类
class Gun:
def __init__(self,gun_name):
self.name = gun_name
self.bullet_count = 0
def shoot(self):
if self.bullet_count <= 0:
print("[%s]子弹打完了,请装填弹药后射击" % self.name)
else:
self.bullet_count -= 1
print("正在开火......[%d]" % self.bullet_count)
def add_bullet(self, count):
self.bullet_count += count
print("已装填弹药%d发" % count)
# 定义士兵类
class Soldier:
def __init__(self, name):
self.name = name
self.gun = None # 新兵没有枪
def fire(self):
if self.gun is None:
print("%s还没有枪" % self.name)
else:
self.gun.add_bullet(8)
self.gun.shoot()
ak47 = Gun("Ak47")
xusanduo = Soldier("许三多")
xusanduo.gun = ak47 # 把ak47赋给士兵的枪属性
xusanduo.fire()
输出:
已装填弹药8发
正在开火......[7]
注意:在定义属性时,如果不知道初始值,可以设置为None。None表示一个空对象,没有方法和属性。针对None比较时,推荐使用is判断。
身份运算符可以比较两个对象的内存地址是否一致。(is, is not)
x is y,类似于 id(x) == id(y)。
is: 用于判断两个变量引用对象是否为同一个。
==:用于判断引用变量的值是否相等。