Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待
4999元包邮
去购买 >
封装是面向对象编程的一大特点。
面向对象编程的第一步 —— 根据职责将属性和方法封装到一个抽象的类中,外界使用类创建对象,然后让对象调用方法,对象方法的细节都被封装在类的内部。
简单的理解封装,即在设计类时,刻意地将一些属性和方法隐藏在类的内部,这样在使用此类时,将无法直接以“类对象.属性名”或者“类对象.方法名(参数)”的形式调用这些属性或方法,而只能用未隐藏的类方法间接操作这些隐藏的属性和方法。
就好比使用电脑,我们只需要学会如何使用键盘和鼠标就可以了,不用关心内部是怎么实现的,因为那是生产和设计人员该操心的。
实例:
需求设计:小明体重 75.0 公斤,每次跑步会减肥 0.5 公斤,每次吃东西体重增加 1 公斤。
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)
xiaoming.run()
xiaoming.eat()
xiaoming.eat()
print(xiaoming)
# 小明 爱跑步,跑步锻炼身体
# 小明 是吃货,吃完这顿再减肥
# 小明 是吃货,吃完这顿再减肥
# 我的名字叫 小明 体重 76.50 公斤
再来一个实例:摆放家具。
需求设计:
1、房子(House) 有户型、总面积和家具名称列表,新房子没有任何的家具。
2、家具(HouseItem) 有名字和占地面积,其中
席梦思(bed) 占地 4 平米
衣柜(chest) 占地 2 平米
餐桌(table) 占地 1.5 平米
3、将以上三件家具添加到房子中。
4、打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表。
首先定义家具类:
class HouseItem:
def __init__(self, name, area):
"""
:param name: 家具名称
:param 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) # [席梦思] 占地面积 4.00
print(chest) # [衣柜] 占地面积 2.00
print(table) # [餐桌] 占地面积 1.50
定义房子类:
class House:
def __init__(self, house_type, area):
"""
:param house_type: 户型
:param area: 总面积
"""
self.house_type = house_type
self.area = area
# 剩余面积默认和总面积一致
self.free_area = area
# 默认没有任何的家具
self.item_list = []
def __str__(self):
# Python 能够自动的将一对括号内部的代码连接在一起
return ("户型:%s\n总面积:%.2f[剩余:%.2f]\n家具:%s"
% (self.house_type, self.area,
self.free_area, self.item_list))
def add_item(self, item):
print("要添加 %s" % item)
my_home = House("两室一厅", 60)
my_home.add_item(bed)
my_home.add_item(chest)
my_home.add_item(table)
print(my_home)
完善添加家具方法:
def add_item(self, item):
# 1. 判断家具面积是否大于剩余面积
if item.area > self.free_area:
print("%s 的面积太大,不能添加到房子中" % item.name)
return
# 2. 将家具的名称追加到名称列表中
self.item_list.append(item.name)
# 3. 计算剩余面积
self.free_area -= item.area
在这个实例中,主程序只负责创建房子对象和家具对象,让房子对象调用 add_item 方法将家具添加到房子中,面积计算、剩余面积、家具列表等处理都被封装到房子类的内部。
封装机制保证了类内部数据结构的完整性,因为使用类的用户无法直接看到类中的数据结构,只能使用类允许公开的数据,很好地避免了外部对内部数据的影响,提高了程序的可维护性。
除此之外,对一个类实现良好的封装,用户只能借助暴露出来的类方法来访问数据,我们只需要在这些暴露的方法中加入适当的控制逻辑,即可轻松实现用户对类中属性或方法的不合理操作。
并且,对类进行良好的封装,还可以提高代码的复用性。