版权声明
- 本文原创作者:谷哥的小弟
- 作者博客地址: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()