Python基础核心经典教程(027)——面向对象特征之封装


版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

概述

面向对象有三大特征:封装、继承、多态。在本章节,我们从面向对象的第一大特征封装说起。什么是封装呢?封装的意思是将属性和方法封装到一个抽象的类中,外界使用类创建对象,并通过对象访问属性和调用方法。

封装示例

在此,以示例形式讲解面向对象的封装特性。

示例1

"""
原创作者:谷哥的小弟
博客地址:http://blog.csdn.net/lfdfhl
示例描述:面向对象三大特征——封装
"""


# 定义类
class Student:

    # 重写__init__方法
    def __init__(self, name, weight):
        self.name = name
        self.weight = weight

    # 每次跑步体重减少0.4斤
    def run(self):
        self.weight = self.weight - 0.4

    # 每次吃大餐体重增加0.6斤
    def eat(self):
        self.weight = self.weight + 0.6

    # 重写__str__方法
    def __str__(self):
        s = "%s的体重是%.2f斤" % (self.name, self.weight)
        return s


# 创建对象
lucy = Student("lucy", 130)
print(lucy)
# 调用方法
lucy.eat()
print(lucy)
# 调用方法
lucy.run()
print(lucy)

# 创建对象
jack = Student("jack", 140)
print(jack)
# 调用方法
jack.eat()
print(jack)
# 调用方法
jack.run()
print(jack)

在这里插入图片描述

示例2

"""
原创作者:谷哥的小弟
博客地址:http://blog.csdn.net/lfdfhl
示例描述:面向对象三大特征——封装
"""


# 定义家具类
class Furniture:
    def __init__(self, name, area):
        # 家具的名称
        self.name = name
        # 家具的面积
        self.area = area

    def __str__(self):
        s = "%s所占面积为%.2f" % (self.name, self.area)
        return s


# 定义房间类
class Room:
    def __init__(self, name, area):
        # 房间名称
        self.name = name
        # 房间面积
        self.area = area
        # 房间剩余面积
        self.freeArea = area
        # 存放房间内家具名称的列表
        self.furnitureList = []

    # 添加家具
    def addFurniture(self, furniture):
        if furniture.area > self.freeArea:
            print("房间容不下该家具")
            return
        # 将家具名称添加至furnitureList
        self.furnitureList.append(furniture.name)
        # 修改房间剩余面积大小
        self.freeArea = self.freeArea - furniture.area

    def __str__(self):
        s = "%s的总面积是%.2f,剩余面积为%.2f,已有家具:%s" % (self.name, self.area, self.freeArea, self.furnitureList)
        return s


# 创建房间对象
room = Room("次卧", 15)
# 创建家具
bed = Furniture("床", 4)
# 往房间中添加家具
room.addFurniture(bed)
# 打印房间
print(room)
# 创建家具
table = Furniture("桌子", 5)
# 往房间中添加家具
room.addFurniture(table)
# 打印房间
print(room)
# 创建家具
sofa = Furniture("沙发", 8)
# 往房间中添加家具
room.addFurniture(sofa)
# 打印房间
print(room)

在这里插入图片描述

示例3

"""
原创作者:谷哥的小弟
博客地址:http://blog.csdn.net/lfdfhl
示例描述:面向对象三大特征——封装
"""


# 定义枪类
class Gun:
    # 重写__init__方法
    def __init__(self, name, bulletNumber):
        # 枪的名称
        self.name = name
        # 子弹数量
        self.bulletNumber = bulletNumber

    # 增加子弹
    def addBulletNumber(self, bulletNumber):
        print("新增子弹%d发" % bulletNumber)
        self.bulletNumber = self.bulletNumber + bulletNumber

    # 射击
    def shoot(self):
        if self.bulletNumber <= 0:
            print("%s没有子弹了,不能开火" % self.name)
            return
        self.bulletNumber = self.bulletNumber - 1
        print("%s开火,剩余子弹数量为:%d" % (self.name, self.bulletNumber))


# 定义士兵类
class Soldier:
    # 重写__init__方法
    def __init__(self, name, gun):
        # 士兵名字
        self.name = name
        # 士兵的枪
        self.gun = gun

    # 开火
    def fire(self):
        self.gun.shoot()


# 创建枪对象
gun = Gun("AK47", 5)
# 创建士兵对象
solider = Soldier("tom", gun)
solider.fire()
solider.fire()
solider.fire()
solider.fire()
solider.fire()
solider.fire()
# 增加子弹
solider.gun.addBulletNumber(2)
solider.fire()
solider.fire()
solider.fire()

在这里插入图片描述

示例4

"""
原创作者:谷哥的小弟
博客地址:http://blog.csdn.net/lfdfhl
示例描述:面向对象三大特征——封装
"""


# 定义枪类
class Gun:
    # 重写__init__方法
    def __init__(self, name, bulletNumber):
        # 枪的名称
        self.name = name
        # 子弹数量
        self.bulletNumber = bulletNumber

    # 增加子弹
    def addBulletNumber(self, bulletNumber):
        print("新增子弹%d发" % bulletNumber)
        self.bulletNumber = self.bulletNumber + bulletNumber

    # 射击
    def shoot(self):
        if self.bulletNumber <= 0:
            print("%s没有子弹了,不能开火" % self.name)
            return
        self.bulletNumber = self.bulletNumber - 1
        print("%s开火,剩余子弹数量为:%d" % (self.name, self.bulletNumber))


# 定义士兵类
class Soldier:
    # 重写__init__方法
    def __init__(self, name):
        # 士兵名字
        self.name = name
        # 士兵的枪,初始值为None
        self.gun = None

    # 开火
    def fire(self):
        # 判断士兵是否有枪
        if self.gun is None:
            print("士兵%s还没有配枪,不能参加战斗" % self.name)
            return
        self.gun.shoot()


# 创建枪对象
gun = Gun("AK47", 5)
# 创建士兵对象
solider = Soldier("tom")
# 开火
solider.fire()
# 为士兵配枪
solider.gun = gun
solider.fire()
solider.fire()
solider.fire()
solider.fire()
solider.fire()
solider.fire()
# 增加子弹
solider.gun.addBulletNumber(2)
solider.fire()
solider.fire()
solider.fire()

在这里插入图片描述

私有属性与私有方法

只能在对象内部访问的属性和方法被称为私有属性和私有方法。在定义属性或方法时,在属性名或者方法名前增加两个下划线 _ _表示该属性或方法是私有的。

示例

"""
原创作者:谷哥的小弟
博客地址:http://blog.csdn.net/lfdfhl
示例描述:面向对象三大特征——封装
"""


# 定义女孩类
class Girl:
    def __init__(self, name):
        # 公有属性
        self.name = name
        # 私有属性
        self.__age = 17

    # 公有方法
    def shopping(self):
        print("%s逛街" % self.name)

    # 私有方法
    def __askAge(self):
        # 访问私有属性
        print("%s的年龄是%d" % (self.name, self.__age))

    # 公有方法
    def party(self):
        print("party()方法开始执行")
        # 在公有方法中访问私有属性
        print("%s的年龄是%d" % (self.name, self.__age))
        # 在公有方法中调用私有方法
        self.__askAge()
        print("party()方法结束执行")


girl = Girl("lucy")
# 访问公有属性
print(girl.name)
# 访问私有属性
# 报错:AttributeError: 'Girl' object has no attribute '__age'
# print(girl.__age)

# 调用公有方法
girl.shopping()

# 调用私有方法
# 报错:AttributeError: 'Girl' object has no attribute '__askAge'
# girl.__askAge()

# 调用公有方法
girl.party()

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谷哥的小弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值