python之面向对象封装案例

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

案例

在对象的方法内部是可以,是可以直接访问属性的

class person:

    def __init__(self, name, weight):

        # self.属性 = 形参
        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)

运行结果

小明 爱跑步,跑步锻炼身体
小明 是吃货,吃完这顿再减肥
我的名字叫 小明 体重是 75.50 公斤

案例扩展

同一个类创建创建的多个对象之间,属性是互不干扰的

class person:

    def __init__(self, name, weight):

        # self.属性 = 形参
        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)

# 小美爱跑步
xiaomei = person("小美", 45)

xiaomei.eat()
xiaomei.run()

print(xiaomei)
print(xiaoming) #  同一个类创建创建的多个对象之间,属性互不干扰

运行结果

小明 爱跑步,跑步锻炼身体
小明 是吃货,吃完这顿再减肥
我的名字叫 小明 体重是 75.50 公斤
小美 是吃货,吃完这顿再减肥
小美 爱跑步,跑步锻炼身体
我的名字叫 小美 体重是 45.50 公斤
我的名字叫 小明 体重是 75.50 公斤

案例2

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.iltem_list = []

    def __str__(self):

        # python能够自动的将一对括号内部的代码连接到一起
        return ("户型: %s\n总面积:%.2f[剩余:%.2f]\n家具:%s"
                % (self.house_type, self.area,
                   self.free_area, self.iltem_list))

    def add_item(self, item):

        print("要添加 %s" % item)
        # 1.判断家具的面积
        if item.area > self.free_area:
            print("%s 的面积太大了,无法添加" % item.name)

            return

        # 2.将家具的名称添加到列表中
        self.iltem_list.append(item.name)

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



# 1.创建家具
bed = HouseItem("席梦思", 40)
chest = HouseItem("衣柜", 2)
table = HouseItem("餐桌", 20)

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

# 2.创建房子对象
my_home = House("两室一厅", 60)

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

print(my_home)

运行结果

[席梦思] 占地 40.00
[衣柜] 占地 2.00
[餐桌] 占地 20.00
要添加 [席梦思] 占地 40.00
要添加 [衣柜] 占地 2.00
要添加 [餐桌] 占地 20.00
餐桌 的面积太大了,无法添加
户型: 两室一厅
总面积:60.00[剩余:18.00]
家具:['席梦思', '衣柜']

定义没有初始值的属性---------在定义属性时,如果不知道设置什么初始值,可以设置为 None
None关键字表示什么都没有,表示一个空对象,没有方法和属性,是一个特殊的常量,可以将None赋值给任何一个变量

class Gun:

    def __init__(self, model):

        # 1.枪的型号号
        self.model = model

        # 2.子弹的数量
        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.发射子弹,-1
        self.bullet_count -= 1

        # 3.提示发射信息
        print("[%s] 突突突。。。[%d]" % (self.model, self.bullet_count))


class Soldier:

    def __init__(self, name,):

        # 1.姓名
        self.name = name

        # 2.枪 - 新兵没有枪
        self.gun = None

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

ak47.add_bullet(50)

ak47.shoot()

# 2.创建许三多
xusanduo = Soldier("许三多")

xusanduo.gun = ak47

print(xusanduo.gun)

运行结果

[AK47] 突突突。。。[49]
<__main__.Gun object at 0x00000221F79732C8>

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

class Gun:

    def __init__(self, model):

        # 1.枪的型号号
        self.model = model

        # 2.子弹的数量
        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.发射子弹,-1
        self.bullet_count -= 1

        # 3.提示发射信息
        print("[%s] 突突突。。。[%d]" % (self.model, self.bullet_count))


class Soldier:

    def __init__(self, name,):

        # 1.姓名
        self.name = name

        # 2.枪 - 新兵没有枪
        self.gun = None

    def fire(self):

        # 1.判断士兵是否有枪
        if self.gun == None:
            print("[%s] 还没有枪。。。" % self.name)

            return

        # 2.高喊口号
        print("冲啊。。。[%s]" % self.name)

        # 3.让枪装填子弹
        self.gun.add_bullet(50)

        # 4.让枪发射子弹
        self.gun.shoot()

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

# 2.创建许三多
xusanduo = Soldier("许三多")

xusanduo.gun = ak47
xusanduo.fire()

print(xusanduo.gun)

运行结果

冲啊。。。[许三多]
[AK47] 突突突。。。[49]
<__main__.Gun object at 0x000001BD648A04C8>

身份运算符

身份运算符用于比较两个对象的内存地址是否一致-------是否对同一个对象的引用
在python中针对None比较时,建议使用is判断

</tbody>
运算符描述实例
isis是判断两个标识符是不是引用同一个对象x is y, 类似id(x) == id(y)
is notis not 是判断两个标识符是不是引用不同的对象x is not y, 类似 id(a) != id(b)

is用于判断两个变量引用的对象是否为同一个
==用于判断引用变量的值是否相等

class Gun:

    def __init__(self, model):

        # 1.枪的型号号
        self.model = model

        # 2.子弹的数量
        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.发射子弹,-1
        self.bullet_count -= 1

        # 3.提示发射信息
        print("[%s] 突突突。。。[%d]" % (self.model, self.bullet_count))


class Soldier:

    def __init__(self, name,):

        # 1.姓名
        self.name = name

        # 2.枪 - 新兵没有枪
        self.gun = None

    def fire(self):

        # 1.判断士兵是否有枪
        # if self.gun == None:
        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()

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

# 2.创建许三多
xusanduo = Soldier("许三多")

xusanduo.gun = ak47
xusanduo.fire()

print(xusanduo.gun)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值