python面向对象(三、封装)

3.封装

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

3.2 小明爱跑步
1)需求和分析:

提示:在 对象的方法内部,是可以直接访问对象的属性的!
2)代码实现:

3.3 扩展 — 小美也爱跑步
1)需求
小明和小美都爱跑步
小明体重75.0公斤
小美体重45.0公斤
每次跑步都会减少0.5公斤
每次吃东西都会增加1公斤

2)代码:

提示:
在对象的方法内部,可以直接访问对象的属性
同一个类创建的多个对象之间,属性互不干扰!每个对象都有各自的内存空间

3.4 摆放家具
1)需求:
(1)房子(House)有户型、总面积和家具名称列表、 新房子没有任何的家具
(2)家具(HouseItem)有名字和占地面积,其中
席梦思(bed)占地4平米
衣柜(chest)占地2平米
餐桌(table)占地1.5平米
(3)将以上三件家具添加到房子中
(4)打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表
2)剩余面积
(1)在创建房子对象时,定义一个剩余面积的属性,初始值和总面积相等
(2)当调用add_item方法,向房间添加家具时,让剩余面积-=家具面积
3)思考:应该先开发哪一个类?
答案:家具类
(1)家具简单
(2)房子要使用到家具,被使用的类,通常应该先开发

3.4.1 创建家具

小结:
创建了一个家具类,使用到__init__和__str__两个内置方法
使用家具类创建了三个家具对象,并且输出家具信息

3.4.2 创建房间

小结:
1)创建了一个房子类,使用到__init__和__str__两个内置方法
2)准备了一个add_item方法准备添加家具
3)使用房子类创建了一个房子对象
4)让房子对象调用了三次add_item方法,将三件家具以实参传递到add_item内部

3.4.3 添加家具
1)需求
(1)判断家具的面积是否超过剩余面积,如果超过,提示不能添加这件家具
(2)将家具的名称追加到家具名称列表中
(3)用房子的剩余面积-家具面积
2)代码:


3)输出:

3.4.4 小结
1)主程序只负责创建房子对象和家具对象
2)让房子对象调用add_item方法将家具添加到房子中
3)面积计算、剩余面积、家具列表等处理都被封装到房子类的内部

3.5 士兵突击
需求:
1)士兵许三多有一把AK47
2)士兵可以开火
3)枪能够发射子弹
4)枪装填装填子弹——增加子弹数量

3.5.1 开发枪类
shoot方法需求:
1)判断是否有子弹,没有子弹无法射击
2)使用print提示射击,并且输出子弹数量

3.5.2 开发士兵类
1)需求:假设:每一个新兵都没有枪
定义没有初始值的属性,在定义属性时,如果不知道设置什么初始值,可以设置为None。
None关键字表示什么都没有,表示一个空对象,没有方法和属性,是一个特殊的常量
可以将None赋值给任何一个变量
fire方法需求:
(1)判断是否有枪,没有枪没法冲锋
(2)喊一声口号
(3)装填子弹
(4)射击
2)代码:一个对象的属性可以是另外一个类创建的对象



3)运行结果:

3.5.3 小结:
1)创建了一个士兵类,使用到__init__内置方法
2)在定义属性时,如果不知道设置什么初始值,可以设置为None
3)在封装的方法内部,还可以让自己的属性使用其他类创建的对象,调用已经封装好的方法

3.6 私有属性和私有方法
3.6.1 应用场景及定义方式
1)应用场景:
(1)在实际开发中,对象的某些属性或方法可能只希望在对象的内部被使用,而不希望在外部被访问到
(2)私有属性就是对象不希望公开的属性,包括:实例属性、类属性
(3)私有方法就是对象不希望公开的方法,包括:实例方法、类属方法、静态方法

2)定义方式
在定义属性或方法时,在属性名或者方法名前增加两个下划线“__”,定义的就是私有属性或方法

常规代码:

私有属性:

私有方法:

3.6.2 伪私有属性和私有方法(科普)
Python中,并没有真正意义的私有。在给属性、方法命名时,实际是对名称做了一些特殊处理,使得外界无法访问到
通过特殊处理即可访问私有属性和方法:在名称前面加上“_类名”
使用“_类名__名称”,即可访问
提示:在日常开发中,不要使用这种方式,访问对象的私有属性或私有方法

原文地址:https://www.cnblogs.com/bdzxh/p/14072287.html