面向对象(Python):学习笔记之封装
封装
- 封装是面向对象编程的一大特点
- 面向对象编程的第一步——将属性和方法封装到一个抽象的类中
- 外界使用类创建对象,然后让对象调用方法
- 对象方法的细节都被封装在类的内部
- 一个对象的属性,可以是另一个类创建的对象
案例一:小明爱跑步
需求:
- 小明体重75.0公斤
- 小明每次跑步减肥0.5公斤
- 小明每次吃东西增加1公斤
类 | Person |
---|---|
属性 |
name weight |
方法 |
__init__(self, name, weight): __str__(self): run(self): ear(self): |
class Person:def __init__(self, name, weight):self.name = nameself.weight = weightdef __str__(self):return "我的名字叫%s,我的体重是:%.2f" % (self.name, self.weight)def eat(self):print("%s 吃了一顿饭" % self.name)self.weight += 1def run(self):print("%s 围着操场跑了几圈 " % self.name)self.weight -= 0.5ming = Person(name="小明", weight=75.0)
ming.eat()
ming.run()
ming.eat()
ming.run()
ming.run()
print(ming)
运行结果:
案例二:小明爱跑步扩展—小美也爱跑步
需求:
- 小明和小美都爱跑步
- 小明体重75.0公斤
- 小妹体重45.0公斤
- 每次跑步都会减少0.5公斤
- 每次吃东西都会增加1公斤
类 | person |
---|---|
属性 |
name weight |
方法 |
__init__(self, name, weight): __str__(self): run(self): ear(self): |
提示:
- 在对象的方法内部,是可以直接访问对象的属性的
- 同一个类创建多个对象之间,属性互不干扰
class Person:def __init__(self, name, weight):self.name = nameself.weight = weightdef __str__(self):return "我的名字叫%s,我的体重是:%.2f" % (self.name, self.weight)def eat(self):print("%s 吃了一顿饭" % self.name)self.weight += 1def run(self):print("%s 围着操场跑了几圈 " % self.name)self.weight -= 0.5ming = Person(name="小明", weight=75.0)
ming.run()
ming.eat()
print(ming)
mei = Person(name="小美", weight=45.0)
mei.eat()
mei.run()
print(mei)
print(ming)
运行结果:
案例三:摆放家具
需求:
1.房子(House)有户型、总面积 和 家具名称列表
- 新房子没有任何的加据
2.家具(HouseItem)有名字和占地面积,其中 - 席梦思(bed) 占地4平米
- 衣柜(chest) 占地2平米
- 餐桌(table) 占地1.5平米
3.将以上三件加据添加到房子里
4.打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表
类 | House |
---|---|
属性 |
houst_type area free_area item |
方法 |
__init__(self, house_type, area): __str__(self): add_item(self, item) : |
类 | HouseItem |
---|---|
属性 |
name area |
方法 |
__init__(self, name, area): __str__(self): |
剩余面积:
1.在创建房子对象时,定义一个剩余面积的属性,初始值和总面积相等
2.在调用add_item方法,向房间添加家具时候,让剩余面积 -= 家具面积
class HouseItem:def __init__(self, name, area):self.name = nameself.area = areadef __str__(self):return "%s的占地面积为%.2f" % (self.name, self.area)class House:def __init__(self, layout, all_area):self.layout = layoutself.all_area = all_areaself.remain_area = all_areaself.item = []def __str__(self):return "这是一个%s的房子,总面积为%.2f,有家具%s,剩余面积为%.2f" \% (self.layout, self.all_area,'、'.join(self.item), self.remain_area)def add_item(self, item):if item.area > self.remain_area:print(" 剩余面积不足,%s无法添加" % item.name)returnelse:self.item.append(item.name)self.remain_area -= item.areabed = HouseItem(name="席梦思", area=4)
chest = HouseItem(name="衣柜", area=2)
table = HouseItem(name="餐桌", area=1.5)house = House(layout="三室两厅", all_area=90)
house.add_item(bed)
house.add_item(chest)
house.add_item(table)
print(house)
运行结果:
案例四:士兵突击
需求:
- 士兵许三多有一把AK47
- 士兵可以开火
- 枪能够发射子弹
- 强能够装填子弹——增加子弹数量
类 | Soldier |
---|---|
属性 |
name gun |
方法 |
__init(self)__ fire(self) |
类 | Gun |
---|---|
属性 |
model bullet_count |
方法 |
__init__(self, model) add_bullet(self, count) shoot(self) |
class Gun:def __init__(self, model):# 枪的型号self.model = model# 子弹的数量self.bullet_count = 0def add_bullet(self, count):# 上弹self.bullet_count += countdef shoot(self):# 判断有无子弹if self.bullet_count <= 0:print("%s 没有子弹了..." % self.model)return# 发射子弹self.bullet_count -= 1# 提示发射信息print("%s 突突突... 剩余子弹为:%d" % (self.model, self.bullet_count))class Soldier:def __init__(self, name):# 假设新兵没有枪,可以用None初始化gunself.gun is Noneself.name = namedef fire(self):# 判断士兵是否有枪if self.gun == 0:print("%s的还没有枪!!!" % self.name)return# 高喊口含print("冲啊!!")# 装弹self.gun.add_bullet(30)# 射击self.gun.shoot()# 定义枪对象
ak47 = Gun("AK47")
# 定义士兵对象
xsd = Soldier("许三多")
xsd.gun = ak47
print(xsd.gun)
xsd.fire()
执行结果:
面向对象(Python):学习笔记之封装相关推荐
- python学习笔记 day25 封装
1. 封装 广义面向对象的封装是为了代码的保护,只让自己的对象调用自己的方法: 狭义的封装是把属性,方法隐藏起来,只供内部调用,不让外部调用: 1. 私有属性--- 在类内部使用__私有属性名 来定义 ...
- Python学习笔记(十九)面向对象 - 继承
Python学习笔记(十九)面向对象 - 继承 一.继承的概念 # 继承:子类继承父类的所有方法和属性# 1. 子类 class A(object):def __init__(self):self.n ...
- Python学习笔记:Day 16 编写移动App
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:Day 10 用户注册和登陆
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:Day 9 编写API
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:Day5 编写web框架
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:Day 3编写ORM
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:异步IO(2)
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:常用第三方模块3
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- python学习笔记4(对象/引用;多范式; 上下文管理器)
python学习笔记4(对象/引用:多范式; 上下文管理器) ### Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象 21. 动态类型:对象/引用 对象和引用: 对象是 ...
最新文章
- 桌子上有个盘子_日本留学生活:留学生在餐厅刷盘子的传闻,竟然在自己身上上演...
- packet tracer使用心得(二)
- vscode markdown-all-in-one 源码编译成vsix
- HDU1010 Tempter of the Bone dfs(奇偶减枝)
- svn 单独导出某一个目录文件
- Nginx的五大应用场景详解
- Linux system函数返回值
- mysql 首次连接慢_mybatis+mysql,第一次数据库连接很慢怎么回事?
- 在工作中常用到的SQL
- JVM调优参数简介、调优目标及调优经验
- C语言实现根据用户输入的整数求和(两种方法)
- centos离线安装docker-ce 18.03.0-ce
- 一个能和企鹅一样飞的创意
- hotmail 获取邮箱授权码
- Android各种模拟器使用笔记
- mysql数据倾斜_Hive SQL 数据倾斜总结
- SAP Marketing Cloud 功能概述(三)
- 人才辈出各领风骚 中国股市十大操盘手排行榜
- 风向值与风向描述定义
- 腾讯 Tars 开源 Go 版本 Tars-Go,并发性能比 gRPC 高 5 倍
热门文章
- 7. Linux 环境
- 33. 深入解析互联网协议的原理
- JAVA wait(), notify(),sleep详解
- QAliber - 介绍一款开源的GUI自动化测试工具
- vue-cli webpack浅析
- 通过Visual Studio 2012 比较SQL Server 数据库的架构变更
- (转帖)如何在DE2上安裝μClinux作業系統? (Nios II )
- 微信小程序——风水罗盘
- 时间操作(JavaScript版)—页面显示格式:年月日星期几
- JAVA随机数生成 | Math.random()方法 | 随机生成int、double类型