[python面向对象学习笔记二] 封装

1.概念

(1)把属性方法封装到中,在外界使用类创建对象,再让对象调用方法

(2)同一个类创建的对象之间,属性互不干扰。

2.案例1

小明体重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 公斤

3.案例2

房子有户型、总面积和家具名称列表三个属性。家具有床、衣柜和餐桌。将三种家具添加到新房子中。

# 创建家具类
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 平米

4.案例3

士兵许三多有一把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: 用于判断两个变量引用对象是否为同一个。
==:用于判断引用变量的值是否相等。

你可能感兴趣的:(python面向对象,类,封装,python)