Python基础之面向对象封装案例

面向对象封装案例

封装

  1. 封装是面型对象编程的一大特点
  2. 面向对象编程的第一步--将属性和方法封装到一个抽象的类中;
  3. 外界使用类创建对象,然后让对象调用方法;
  4. 对象方法的细节都被封装在类的内部。

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

跑步案例

单对象案例

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("今天跑步了,又能瘦一点了")
        self.weight -= 0.5

    def eat(self):
        print("吃了一顿,又要胖了,唉")
        self.weight += 1


xiaoming = Person("小明", 75.0)
print(xiaoming)
xiaoming.run()
xiaoming.eat()
print(xiaoming)

# 小明 的体重是 75.00
# 今天跑步了,又能瘦一点了
# 吃了一顿,又要胖了,唉
# 小明 的体重是 75.50

一个类创建多个对象案例

多个对象属性之间互不干扰;即小美跑步和吃东西并不影响小明的体重;

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.0)
xiaoming.run()
xiaoming.eat()

print(xiaoming)

xiaohong = Person("小红", 45.0)
xiaohong.run()
xiaohong.eat()

print(xiaohong)

家具案例

被使用的类应该先开发;
房子中要有家具,所以在开发房子前应该先开发家具类;

定义家具类

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)

# 席梦思 占地 4.00
# 衣柜 占地 2.00
# 桌子 占地 1.50

定义房子类

class HouseItem:
    def __init__(self, name, area):
        self.name = name
        self.area = area

    def __str__(self):
        return "%s 占地 %.2f" % (self.name, self.area)


class House:
    def __init__(self, house_type, area):
        self.house_type = house_type
        self.area = area
        # 剩余面积和家具列表
        self.free_area = area
        self.house_item = []

    def __str__(self):
        # python能够自动将一对括号内的代码连接在一起
        return ("户型:%s, 总面积:%.2f, 剩余面积:%.2f, 家具:%s"
                % (self.house_type, self.area, self.free_area, self.house_item))

    def add_item(self, item):
        print("要添置 %s" % item)


# 创建家具
bed = HouseItem("席梦思", 4)
chest = HouseItem("衣柜", 2)
table = HouseItem("桌子", 1.5)

# 创建房子
my_house = House("两室一厅", 80)
my_house.add_item(bed)
my_house.add_item(chest)
my_house.add_item(table)

print(my_house)

# 要添置 席梦思 占地 4.00
# 要添置 衣柜 占地 2.00
# 要添置 桌子 占地 1.50
# 户型:两室一厅, 总面积:80.00, 剩余面积:80.00, 家具:[]

添置家具代码的完成
添置家具前先判断,家具是否超过空闲面积,如果太大就不添置;再进行添置下一件,小的则添置进去。

class HouseItem:
    def __init__(self, name, area):
        self.name = name
        self.area = area

    def __str__(self):
        return "%s 占地 %.2f" % (self.name, self.area)


class House:
    def __init__(self, house_type, area):
        self.house_type = house_type
        self.area = area
        # 剩余面积和家具列表
        self.free_area = area
        self.house_item = []

    def __str__(self):
        # python能够自动将一对括号内的代码连接在一起
        return ("户型:%s, 总面积:%.2f, 剩余面积:%.2f, 家具:%s"
                % (self.house_type, self.area, self.free_area, self.house_item))

    def add_item(self, item):
        print("要添置 %s" % item)
        # 判断家具面积
        if item.area >= self.free_area:
            print("%s 的面积太大,无法放下" % item)
            return
        # 将家具名称放在家具列表中
        self.house_item.append(item.name)

        # 计算剩余面积
        self.free_area -= item.area


# 创建家具
bed = HouseItem("席梦思", 15)
chest = HouseItem("衣柜", 9)
table = HouseItem("桌子", 8)

# 创建房子
my_house = House("三室一厅", 80)
my_house.add_item(bed)
my_house.add_item(chest)
my_house.add_item(table)

print(my_house)

# 要添置 席梦思 占地 15.00
# 要添置 衣柜 占地 9.00
# 要添置 桌子 占地 8.00
# 户型:三室一厅, 总面积:80.00, 剩余面积:48.00, 家具:['席梦思', '衣柜', '桌子']

士兵开枪案例

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

士兵开枪案例

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):
        # 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
        # 枪,新兵没有枪
        self.gun = None

    def fire(self):
        # 1.判断有没有枪
        if self.gun is None:
            print("%s 还没有枪。。。" % self.name)
            return
        # 2.喊口令
        print("%s 冲鸭。。。" % self.name)
        # 3.装填子弹
        self.gun.add_bullet(50)
        # 4.让枪发射子弹
        self.gun.shoot()
        pass


# 创建枪对象
ak47 = Gun("AK47")

# 创建士兵
xusanduo = Solider("许三多")
xusanduo.gun = ak47
xusanduo.fire()

猜你喜欢

转载自www.cnblogs.com/yifchan/p/others-1-13.html