小明爱跑步

  1. 小明 体重 75.0 公斤
  2. 小明每次 跑步 会减肥 0.5 公斤
  3. 小明每次 吃东西 体重增加 1 公斤
class Person:
    """人 类"""

    def __init__(self, name, weight):

        self.name = name
        self.weight = weight

    def __str__(self):

        return "%s 的体重 %.2f 公斤" % (self.name, self.weight)

    def run(self):

        print("%s 爱跑步,跑步锻炼身体" % self.name)
        self.weight -= 0.5

    def eat(self):

        print("%s 是吃货,吃完这顿再减肥" % self.name)
        self.weight += 1


xiaoming = Person("小明", 75)

xiaoming.run()
xiaoming.eat()
xiaoming.eat()
xiaoming.eat()

print(xiaoming)

输出:

小明 爱跑步,跑步锻炼身体
小明 是吃货,吃完这顿再减肥
小明 是吃货,吃完这顿再减肥
小明 是吃货,吃完这顿再减肥
小明 的体重 77.50 公斤

摆放家具

  • 房子(House)有 户型总面积家具列表
  • 新房子没有任何的家具
  • 家具(HouseItem) 有 名字占地面积,其中
    • 席梦思(bed) 占地 4 平米
    • 衣柜(chest) 占地 2 平米
    • 餐桌(table) 占地 1.5 平米
  • 将以上三件家具 添加 到房子中
  • 打印房子时,要求输出:户型总面积剩余面积家具名称列表

房子要使用到家具,所以应该先开发家具类。

家具类

class HouseItem:

    def __init__(self, name, area):

        self.name = name
        self.area = area

    def __str__(self):

        return "[%s] 占地面积 %.2f" % (self.name, self.area)


bed = HouseItem("席梦思", 4)
chest = HouseItem("衣柜", 2)
table = HouseItem("餐桌", 1.5)

print(bed)
print(chest)
print(table)

房间类

class House:

    def __init__(self, house_type, area):

        self.house_type = house_type
        self.area = area
        self.free_area = area
        self.item_list = []

    def __str__(self):

        # Python 能够自动将一对括号内的代码连接在一起,所以可增加换行来提高可读性
        return ("户型:%s\n总面积:%.2f[剩余:%.2f]\n家具:%s"
                % (self.house_type, self.area,
                   self.free_area, self.item_list))

    def add_item(self, item):

        print("要添加 %s" % item)


my_home = House("两室一厅", 60)

my_home.add_item(bed)
my_home.add_item(chest)
my_home.add_item(table)

print(my_home)

添加家具 add_item

def add_item(self, item):

    print("要添加 %s" % item)
    if item.area > self.free_area:

        print("%s 的面积太大,不能添加到房子中" % item.name)
        return

    self.item_list.append(item.name)
    self.free_area -= item.area

士兵突击

  1. 士兵 许三多 有一把 AK47
  2. 士兵 可以 开火
  3. 能够 发射 子弹
  4. 装填 装填子弹 —— 增加子弹数量

一个对象的属性可以是另一个对象创建的类。

应该先开发枪类,因为士兵的属性要用到枪。

枪类

class Gun:

    def __init__(self, model):

        self.model = model
        self.bullet_count = 0

    def add_bullet(self, count):

        self.bullet_count += count

    def shoot(self):

        if self.bullet_count <= 0:
            print("没有子弹了...")
            return

        self.bullet_count -= 1
        
        print("%s 发射了 1 颗子弹,剩余子弹 [%d]..." % (self.model, self.bullet_count))


ak47 = Gun("ak47")
ak47.add_bullet(50)
ak47.shoot()

士兵类

假设每一个新兵 都 没有枪。这种情况下,在定义属性时,可以设置为关键字 None
None 可以赋值给任何一个变量。

class Solider:

    def __init__(self, name):

        self.name = name
        self.gun = None

    def fire(self):

        if self.gun is None:
            print("[%s] 还没有枪..." % self.name)
            return

        print("冲啊...[%s]" % self.name)


        self.gun.add_bullet(50)
        self.gun.shoot()

X = Solider("X")
X.fire()
X.gun = ak47
X.fire()

身份运算符

身份运算符用于比较两个对象的 内存地址 是否一致,即是否是对同一个对象的引用。

  • is:判断两个标识符是不是引用同一个对象,类似于 id(x) == id(y)
  • is not:类似于 id(a) != id(b)

当涉及到 None 的比较时,建议用 is 而不是 ==
is== 区别:

  • is 用于判断两个变量 引用 对象是否为同一个
  • == 用于判断 引用变量的值 是否相等
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> b is a 
False
>>> b == a
True