【“笨办法”学Python】43.基本的面向对象分析和设计——自顶向下、自底向上

article/2025/7/1 11:17:38

43.基本的面向对象分析和设计


文章目录

  • 前言
  • 一、解决问题的方法——流程
    • 1、自顶向下(top down)
    • 2、自底向上
  • 二、代码示例
  • 三、运行Python程序
  • 总结


前言

  使用Python,尤其是通过面向对象编程(OOP)方式构建一些东西的流程。


一、解决问题的方法——流程

  所谓按照流程就是遵循一系列的步骤,但是并不意味着对每个不同的问题都要用这个步骤,也并不意味着这个步骤总是能起作用。这些步骤只是解决很多编程问题的一个很好的起点,并不是解决这类问题的唯一方法。

1、自顶向下(top down)

  自顶向下(top down)的过程一般是从做抽象的概念(顶层)开始,一直向下做到具体的代码实现。具体流程如下:
(1) 把要解决的问题写下来,或者画出来
(2) 将第一条中的关键概念提取出来并加以研究
(3) 创建一个类层次结构和对象图
(4) 用代码实现各个类,并写一个测试来运行它们
(5) 重复上述步骤并细化代码

2、自底向上

  自底向上就是先从代码开始,一直向上做到抽象概念。具体流程如下:
(1) 取出要解决的问题中的一小块,写一些代码让它基本可以工作
(2) 加上类和自动测试,细化代码让他更为正式
(3) 把关键概念抽取出来然后研究它们
(4) 把真正需要实现的东西描述出来
(5) 回去细化代码,有可能需要全部丢弃从头做起
(6) 在问题的另一小块里重复上述流程


二、代码示例

  《来自Peracl 25号行星的哥顿人》的代码:

#coding:utf-8
from sys import exit
from random import randint
from textwrap import dedentclass Scene(object):def enter(self):print("此场景尚未配置!")print("子类化它并实现enter().")exit(1)class Engine(object):def __init__(self,scene_map):   #scene_map是Map类的self.scene_map = scene_mapdef play(self):current_scene = self.scene_map.opening_scene()last_scene = self.scene_map.next_scene('finished')while current_scene != last_scene:                    #返回的都是场景的类next_scene_name = current_scene.enter()         #返回的都是场景的类对应的keycurrent_scene = self.scene_map.next_scene(next_scene_name)current_scene.enter()class Death(Scene):quips = ["你死了", "你在这有点糟糕", "干得漂亮,你死了,愚蠢的人类", "失败者", "我有只小狗很擅长这个"]def enter(self):print (Death.quips[randint(0,len(self.quips)-1)])exit(1)class CentralCorridor(Scene):def enter(self):print (dedent("""Percal25号行星的哥顿人入侵了你的飞船,摧毁了你的全体船员。你是最后一个幸存的成员,你的最后一个任务是从武器库取出中子毁灭性炸弹,放在舰桥上,进入逃生舱后炸毁飞船。你正沿着通往武器库的中央走廊奔跑,这时一个哥顿人跳了出来,皮肤发红,牙齿发黑,邪恶的小丑服装在他那带帽的身体上飘荡。他堵住了军械库的门,准备拔出武器来炸你."""))action =input("> ")if action == "shoot":print (dedent("""快速抽签,即可取出爆破器并向Gothon发射。他的小丑服装在他的身上四处流动,这使你无法瞄准。你的激光打中了他的服装,但完全没有击中他。这完全毁了他母亲买给他的崭新服装,这使他疯狂地飞起来,反复地对着你炸开,直到你死了。然后他吃了你。"""))return "death"elif action == "dodge":print (dedent("""就像一个世界级的拳击手,你躲闪、编织、滑动和滑动,就像哥顿的爆破者用激光从你的头上划过一样。在你的巧妙的中间,你的脚滑倒,你的头撞到精神墙上,昏倒了。你醒来后不久就死了,因为哥顿跺着你的头吃了你"""))return "death"elif action == "tell a joke":print (dedent("""幸运的是,它们使您在学院里学习了哥德的侮辱。你讲了一个你知道的Gothon笑话:Lbhe zbgure vf fb sng , jura fur fgf nebhag gur ubhfrfur fgf nebhag gur ubhfr .Gothon停了下来,试着不笑,然后突然大笑起来,动弹不得。当他在笑的时候,你跑上前朝他头部开了一枪,把他打倒在地,然后跳过武器库的门。"""))return "laser_weapon_armory"else:print ("别想了")return 'central_corridor'class LaserWeaponArmory(Scene):def enter(self):print (dedent("""你向武器库俯冲,蹲下并扫视房间,寻找更多可能藏匿的哥顿人。这里死气沉沉的,太安静了。 你站起来,跑到房间的另一边,发现中子弹在它的容器里。盒子上有个小键盘锁,你需要密码才能把炸弹取出来。如果你把代码错了10次,那么锁就会永远关闭,你就拿不到炸弹了。密码是3位数字"""))code = f"{randint(1,9)}{randint(1,9)}{randint(1,9)}"# code = "636"guess = input("[keypad]> ")guesses = 0while guess != code and guesses < 10:print ("BZZZZEDDD!")guesses += 1guess = input("[keypad]> ")if guess == code:print (dedent("""容器咔嗒一声打开,密封破裂,释放气体。你抓住中子弹,尽可能快地跑到桥上,你必须把它放在正确的位置。"""))return "the_bridge"else:print (dedent("""锁最后一次嗡嗡作响,然后当机械融合在一起时,你会听到一种令人恶心的融化的声音。你决定坐在那里,最后哥特人炸毁了他们的船,你就死定了。"""))return "death"class TheBridge(Scene):def enter(self):print (dedent("""你手臂下夹着尼特龙自毁炸弹冲进舰桥,让5个试图控制飞船的哥特人大吃一惊。他们每个人都有比上一个更丑的小丑服装。他们还没有拿出武器,因为他们看到你腋下的炸弹很活跃,不想引爆它。"""))action = input("> ")if action == "throw the bomb":print (dedent("""你惊慌失措地把炸弹扔给一群哥特人,然后向门口扑去。就在你掉下去的时候,一个哥顿朝你的后背开枪杀了你。当你死后,你看到另一个哥特人疯狂地试图解除炸弹的武装。你死的时候知道他们很可能会在它爆炸的时候降落。"""))return "death"elif action == "slowly place the bomb":print (dedent("""你用爆能枪指着腋下的炸弹,哥特人举起手开始出汗。你向后退一步,打开门,然后小心地把炸弹放在地板上,用爆炸机对准它。然后你从门里跳回来,按一下关门按钮,然后打开门锁,这样哥特人就不能出去了。既然炸弹放好了,你就跑去逃生舱,从这个罐头罐上下来。"""))return "escape_pod"else:print("别想了")return "the_bridge"class EscapePod(Scene):def enter(self):print (dedent("""你拼命地冲过船,试图在整个船爆炸之前使其到达逃生舱。似乎船上几乎没有哥特人,因此你的奔跑没有干扰。你带着逃生舱进入密室,现在需要选择一个来逃生。其中一些可能已损坏,但您没有时间看。有5个吊舱,您要拿哪一个?"""))good_pod = randint(1, 5)# good_pod = 3guess = input("[pod #]> ")if int(guess) != good_pod:print (dedent("""你跳进 {guess} 号逃生仓,按下了弹出按钮吊舱从太空中逃出来,然后在船体破裂时内爆,把你的身体压成果酱果冻。"""))return "death"else:print (dedent("""你跳入吊舱(猜猜)并按下弹出按钮。太空舱很容易滑入太空,向下面的行星前进。当它飞向这个星球时,你回过头来,看到你的飞船内爆,然后像一颗明亮的恒星一样爆炸,同时把哥顿飞船炸掉。你赢了!"""))return "finished"class Finished(Scene):def enter(self):print("你赢了!干得漂亮!!!")return "finished"class Map(object):scenes = {'death':Death(),'central_corridor':CentralCorridor(),'laser_weapon_armory':LaserWeaponArmory(),'the_bridge':TheBridge(),'escape_pod':EscapePod(),'finished':Finished()}def __init__(self,start_scene):self.start_scene=start_scene                # 确定开始的场景def next_scene(self,scene_name):val=Map.scenes.get(scene_name)return val                                  # 返回scenes字典中所有对应的类def opening_scene(self):return self.next_scene(self.start_scene)    # 返回开始场景在scenes字典中对应的类a_map = Map('central_corridor')
# print(a_map)
a_game = Engine(a_map)
a_game.play()

三、运行Python程序

  在Window上键入Python就可以看到结果。依次输入:tell a joke 、密码 、slowly place the bimb 、救生吊舱号码,就能获得游戏胜利!

python ex43.py

请添加图片描述


总结

  以上内容介绍了基本的面向对象分析和设计,有关Python、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’◡’●)。


http://chatgpt.dhexx.cn/article/mwq4CCeY.shtml

相关文章

5大代码规则,守护程序猿世界的爱与和平!

全文共2878字,预计学习时长9分钟 图源:Unsplash 编码规则是程序编码所要遵循的规则,要注意代码的正确性、稳定性、可读性。 而对于这些条条框框,一些不拘小节的程序猿们往往并不在意,这导致常常会发生一些意想不到的问题和状况,让大家苦恼不已。 现在,小芯整理了一份…

【AI产品】认猫、认花、认车、认吃,请认准识别全能王

欢迎来到《AI产品》专栏&#xff0c;本专栏面向所有热爱人工智能技术的朋友、同学。在本专栏中&#xff0c;会多多分享给大家不同种类的且新奇有趣的AI产品&#xff0c;对产品中的核心技术进行深度剖析。文章底部会推荐相关核心技术学习资料&#xff0c;全部原创&#xff01; 请…

【杂谈】什么文章可以给有三AI投稿?你能得到什么

我们公众号的风格是做系统性的原创&#xff0c;除了一些资源类的东西&#xff0c;大多数是专栏&#xff0c;大部分是有三本人在写&#xff0c;还有一些是其他的专栏作者&#xff0c;那么现在有哪些专栏可以自由投稿&#xff0c;新手也可以来练练手呢&#xff0c;今天就来汇总一…

听声音做钥匙?!慢放开锁音轨,黑客就能破解常用门锁

作者&#xff5c;牛婉杨 出品&#xff5c;大数据文摘 你熟悉的黑客是不是这样的&#xff1f;比如上个月&#xff0c;黑客造成推特史上最严重的安全事故&#xff0c;马斯克奥巴马等多位大V账号被黑&#xff1b;或者像8月初英特尔的那起数据泄露事故&#xff0c;足足20GB数据被黑…

【AI产品】爱做短视频的你,真的很需要一款配音软件

欢迎来到《AI产品》专栏&#xff0c;本专栏面向所有热爱人工智能技术的朋友、同学。在本专栏中&#xff0c;会多多分享给大家不同种类的且新奇有趣的AI产品&#xff0c;对产品中的核心技术进行深度剖析。文章底部会推荐相关核心技术学习资料&#xff0c;全部原创&#xff01; 请…

怎样设计宝藏游戏_宝藏! 免费的移动设计资源

怎样设计宝藏游戏 Being a designer usually requires staying in the know of resources that you could use to get better at your craft as well as resources you could use in your work. 成为设计师通常需要了解可以用来提高自己的Craft.io水平的资源以及可以在工作中使…

webaudio_WebAudio Deep Note,第5部分:增益节点

webaudio Previously on "Deep Note via WebAudio": 以前在“通过WebAudio进行深度注释”中&#xff1a; intro 介绍play a sound 播放声音 2.1. boots and cats2.1。 靴子和猫play a sound 播放声音 loop and change pitch循环并改变音高multiple sounds多种声音no…

web audio api_带有Web Audio API的动态声音

web audio api This article is part of a web dev series from Microsoft. Thank you for supporting the partners who make SitePoint possible. 本文是Microsoft的Web开发系列的一部分。 感谢您支持使SitePoint成为可能的合作伙伴。 Before the Web Audio API, HTML5 gave…

Apache Spark【从无到有从有到无】【编程指南】【AS5】结构化流编程指南

目录 1.概观 2.快速示例 3.编程模型 3.1.基本概念 3.2.处理事件时间和延迟数据 3.3.容错语义 4.使用数据集和数据框架的API 4.1.创建streaming DataFrames 和 streaming Datasets 4.1.1.输入源&#xff08;Input Sources&#xff09; 4.1.2.流式数据帧/数据集&#x…

王者荣耀scratch版

现在&#xff0c;防沉迷使我每周都玩不了王者了&#xff0c;不对&#xff0c;不是周5&#xff0c;6&#xff0c;7&#xff0c;八点到九点能玩吗&#xff0c;偶不&#xff0c;那时候我正在上课。。。。。。 现在我&#xff0c;正式想你介绍“Scrach版王者荣耀”&#xff01;&…

编程斐波那契数列_通过斐波那契序列记忆和制表法进行动态编程的简介

编程斐波那契数列 Lately I have been studying algorithms and data structures while trying to prepare for technical interviews. Some of it comes easier than the rest, but I always enjoy a good challenge. I love the whiteboard problems that feel like a puzzle…

javascript编程题_JavaScript中的鼠标滚轮编程

javascript编程题 In this article Ill describe cross-browser techniques for using the mouse wheel (or "scroll wheel") in your JavaScript programming for HTML pages. Ill show example Javascript for option selection and image zooming. 在本文中&…

【AI产品】智能修图时代已来临?「咔嗒」一下,轻松后期

欢迎来到《AI产品》专栏&#xff0c;本专栏面向所有热爱人工智能技术的朋友、同学。在本专栏中&#xff0c;会多多分享给大家不同种类的且新奇有趣的AI产品&#xff0c;对产品中的核心技术进行深度剖析。文章底部会推荐相关核心技术学习资料&#xff0c;全部原创&#xff01; 请…

在网易咔哒上面制作SCRATCH小程序

小朋友在网易咔嗒上面创作作品。

什么是命令行参数

命令行参数&#xff1a;在启动这个程序的时候可以给这个程序从命令行中传递一些参数 这个- l就叫做命令行参数 int main(int argc ,char* argv[],char* env[])argc :命令行参数的个数 argv :命令行参数的内容 env:环境变量

Python教程:命令行参数处理

sys模块 sys模块代表了Python解释器&#xff0c;主要用于获取和Python解释器相关的信息&#xff0c;其中 sys.argv 可以获取命令行参数 在Python交互式解释器中可以先导入sys模块 import sys&#xff0c;再输入 dir(sys) 查看sys模块所包含的全部程序单元&#xff08;包括变量…

java命令行参数详解

java 命令参数详解_赶路人儿的博客-CSDN博客_java命令行参数java命令用于启动 java 应用&#xff1a;它首先会启动 java 运行时环境&#xff08;JRE&#xff09;&#xff0c;然后加载指定的类&#xff0c;调用类的main()方法。main()方法必须定义为public和static的&#xff0c…

浏览器命令行参数

浏览器命令行参数 一、Google浏览器 1.命令行参数 --google-url ”" 地址栏打开网址&#xff08;官方并无此命令&#xff09; --app”" 无地址栏打开网址 --allow-running-insecure-content Https协议页面允许请求http资源加载 --disable-web-security 禁用同源安…

九、命令行参数

对应的视屏链接&#xff1a;鲍松山的个人空间_哔哩哔哩_bilibili 目录 1、命令行参数概述 2、命令行参数使用 3、命令行参数应用----文件拷贝 1、命令行参数概述 平时写主函数为: int main() {return 0; } 事实上main函数是可以带参数的&#xff0c;我们把main函数的参数称为…