描述一个星系和描述一所学校有的思维方式是一样的,其实和python关系不大。都可用面向对象思维来抽象。描述某个物体通常都要先思考几个问题:该物体是什么?

该物体有什么特征?

该物体有什么能力?

该物体的关系网?

等等。

以此来看看太阳系!由于对天文知识不是很熟,所以去百度百科了解一下:太阳系(太阳和所有受到太阳的引力约束天体的集合体)_百度百科​baike.baidu.com

描述完整的太阳系需要多方面的知识。我是没有这个能力的。所以就截取部分来说吧。如下:太阳系是以太阳为中心,和所有受到太阳的引力约束天体的集合体。包括八大行星(由离太阳从近到远的顺序:水星、金星、地球、火星、木星、土星、天王星、海王星)、以及至少173颗已知的卫星、5颗已经辨认出来的矮行星和数以亿计的太阳系小天体。

广义上,太阳系的领域包括太阳,四颗像地球的内行星,由许多小岩石组成的小行星带,四颗充满气体的巨大外行星和充满冰冻小岩石被称为柯伊伯带的第二颗小天体区。其中目前太阳系有八大行星,分别是水星,金星,地球,火星,木星,土星,天王星,海王星。

银河系是一个棒旋星系,[1]直径约10万光年,包括一千亿到四千亿恒星。太阳是银河系较典型的恒星,位于分支悬臂猎户臂上,离银河系中心有2.61万光年,太阳系移动速度约240㎞/s,2.26亿年转一圈。

根据上面的内容,下面来逐步推演,并最终转化成相应的代码。推演的过程从空间角度展开。

太阳系

先从太阳系谈起。以开头说的三个思考角度来说这个问题。

是什么?

太阳系以太阳为中心,和所有受到太阳的引力约束的天体组成的集合体。

简单抽象,图示如下:

代码描述如下:

class SolarSystem:

center = "太阳"

celestial_bodies = ["金星", "水星", "木星", "月亮", ...]

太阳系只有一个,也可以做成单例。如果再往高层次去看,比如银河系,太阳系就是由星系类产生的对象。

有什么特征?

这里有一句话描述了太阳系的部分特征。太阳系移动速度约240㎞/s,2.26亿年转一圈。修改代码如下:

class SolarSystem:

def __init__(self):

self.center = "太阳"

self.celestial_bodies = ["金星", "水星", "木星", "月亮", ...]

self.speed_per_second = 240000

self.revolution_cycle = 2.26 * 1e8

这里只列举了部分。当然还有其他一些特征,比如三维空间的长宽高。

有什么能力

"太阳系移动速度约240㎞/s" 这句话表明了太阳系有移动的能力。下面给太阳系加上移动的能力:

class SolarSystem:

def __init__(self):

self.center = "太阳"

self.celestial_bodies = ["金星", "水星", "木星", "月亮", ...]

self.speed_per_second = 240000

self.revolution_cycle = 2.26 * 1e8

def move(self, duration):

print("太阳系移动了", duration * self.speed_per_second)

这么介绍太阳系感觉也太简单了,下面来继续说说它内部的组成。

天体

太阳系是由太阳和其他被太阳吸引的天气组成的集合。既然太阳系中那么多天体,那么可以为天体建议一个通用的类模板:

class CelestialBody:

pass

不过这里有个问题,我们来重读一遍开头的描述,太阳系是:包括八大行星(由离太阳从近到远的顺序:水星、金星、地球、火星、木星、土星、天王星、海王星)、以及至少173颗已知的卫星、5颗已经辨认出来的矮行星和数以亿计的太阳系小天体。

虽然都是天体,但是它们都有着不同的分类。再按之前的思路开始天体的描述:

是什么

描述中没有说明什么是天体,可知的是恒星(太阳)、行星(水星、金星、地球、火星、木星、土星、天王星、海王星)、卫星、矮行星等都是天体。

虽然大家都是天体,但是各自的特征并不相同,需要单独定义它们。

class Sun:

"""太阳"""

def __init__(self):

self.name = "太阳"

class Planet:

"""行星"""

def __init__(self, name):

self.name = name

class DwarfPlanet:

"""矮行星"""

def __init__(self, name):

self.name = name

class Satellite:

"""卫星"""

def __init__(self, name):

self.name = name

太阳因为其特殊性,没有定义恒星的类。就像没有定义星系类,只定义了太阳系一样,因为我们关注的重点仅限于太阳系。

注意,此处不同类型的天体没有像Java和C++定义一个天体基类。python不强调严格的接口继承关系,而是用的一种叫做鸭子模型的设计思想,你有鸭子的能力你就是鸭子。有兴趣可以去搜一下。

有什么特征和能力

这两个问题就不展开了,因为要涉及到各类型天体的具体情况。思路是和描述太阳系一样的。

其他组成

摘取的百度百科中有个广义的描述,如下:太阳系的领域包括太阳,四颗像地球的内行星,由许多小岩石组成的小行星带,四颗充满气体的巨大外行星和充满冰冻小岩石被称为柯伊伯带的第二颗小天体区。其中目前太阳系有八大行星,分别是水星,金星,地球,火星,木星,土星,天王星,海王星。

太阳系中还有内行星,小行星带,巨大外行星,以及由巨大外行星和充满冰冻小岩石被称为柯伊伯带的第二颗小天体区。也可以定义相应的类。

class InnerPlanet:

"""内行星"""

def __init__(self, name):

self.name = name

class AsteroidBelt

"""小行星带"""

def __init__(self, name):

self.name = name

class SecondCelestialBodyArea:

""""第二天体区"""

关系网

刚开始,我们描述太阳中的天体简单,下面按不同关系整理出来的太阳系:

class SolarSystem:

def __init__(self):

self.center = Sun()

self.celestial_bodies = [Planet(), "水星", "木星", "月亮", ...]

self.secondCelestial_body_area = SecondCelestialBodyArea()

self.asteroid_belt = []

self.speed_per_second = 240000

self.revolution_cycle = 2.26 * 1e8

def move(self, duration):

print("太阳系移动了", duration * self.speed_per_second)

还有第二天体区,内行星属于第二天体区:

class SecondCelestialBodyArea:

""""第二天体区"""

def __init__(self):

self.inner_planets = [InnerPlanet("1"), InnerPlanet("2"), InnerPlanet("3")]

还有卫星围绕着行星运动:

class Planet:

"""行星"""

def __init__(self, name):

self.name = name

self.Satellite = []

继续的话还需要提供很多方法给响应的类,以方便我们获取相应的数据。

就写到这里吧,感觉有点晕了。感觉自己也是挺闲的。

python模拟行星运动_如何用PYTHON程序模拟一个太阳系?相关推荐

  1. python每月定时_如何用Python写一个每分每时每天的定时程序

    阅读本文大概需要4分钟 上一篇我们学习了Python关于时间,日期,日历的一些基本用法,现在我们通过两个精选例子让你融汇贯通,快来看看吧 1.计算生日是星期几 当你女朋友要过生日了,你肯定要定找家饭店 ...

  2. python做网站开发_如何用Python做网站开发

    很多人想要用Python做网站开发,但是又不知从何入手,接下来小编介绍用Python做网站开发需要学习哪些知识,又应该以什么样的顺序来学. 第一步:HTML(超文本标记语言)是网页的核心,学好HTML ...

  3. python读取二进制文件_如何用python读取二进制文件?

    我发现用Python读取二进制文件特别困难.你能帮我一把吗?我需要读取这个文件,在Fortran 90中,该文件很容易被int*4 n_particles, n_groups real*4 group ...

  4. python md5加密_如何用python“优雅”的调用有道翻译?

    前言 其实在以前就盯上有道翻译了的,但是由于时间问题一直没有研究(我的骚操作还在后面,记得关注),本文主要讲解如何用python调用有道翻译,讲解这个爬虫与有道翻译的js"斗争"的 ...

  5. python求平均值_如何用python求平均值

    学习了Python相关数据类型,函数的知识后,利用字符串的分割实现了输入任意多个数据,并计算其平均值的小程序.思路是接收输入的字符串,以空格为分隔符,将分割的数据存入列表(lst1)中,将lst1中的 ...

  6. python小助手_如何用python写个人专属群聊提醒小助手?

    前言 大家还记得教会父母玩微信是什么时候吗?父母学会后,我们的生活就发生了「质」的变化,父母也许会吐槽你的微信头像不好,要你换一个头像. 最近 pk哥 又被母后大人吐槽了,原因是亲戚微信群里某个亲戚生 ...

  7. 如何用python计算圆周率_如何用python计算圆周率?

    如何用python计算圆周率? python计算圆周率的方法: 圆周率没有精确的计算公式,所以只能用近似的方式计算它的近似值. 我们运用蒙特卡罗方法,思路很简单,在下面图形中随机抛置大量的点, 计算落 ...

  8. python 英语分词_如何用Python做中文分词?

    打算绘制中文词云图?那你得先学会如何做中文文本分词.跟着我们的教程,一步步用Python来动手实践吧. 需求 在<如何用Python做词云>一文中,我们介绍了英文文本的词云制作方法.大家玩 ...

  9. 怎么用python启动谷歌浏览器_如何用python控制浏览器

    selenium从2.0开始集成了webdriver的API,提供了更简单,更简洁的编程接口.selenium webdriver的目标是提供一个设计良好的面向对象的API,提供了更好的支持进行web ...

最新文章

  1. 平板电脑安装软件_题宝典软件升级了,微信公众号版不受影响,电脑版/手机APP/平板APP需要重新下载安装...
  2. BZOJ3566 SHOI2014概率充电器(动态规划+概率期望)
  3. numpy的生成网格矩阵 meshgrid()
  4. 线程通信的经典问题:生产者消费者问题
  5. springboot 项目实战 基本框架搭建(IDEA)
  6. linux centOS基本配置搭建
  7. python高阶爬虫---视频类内容爬取,内含详细教程和代码实例
  8. QTTabBar我装好啦!
  9. 学习笔记(8)之VelocityTracker
  10. styl类型文件css,styl样式文件问题:vue重复加载
  11. python爬虫自学笔记本(2015.12.14)
  12. 重庆2021年高考二诊成绩查询,2021年重庆二诊,2021年4月重庆二诊考试,重庆二诊康德卷...
  13. php 正则获取邮箱后缀名,php中邮箱地址正则表达式实现与详解
  14. js正则之前瞻后顾与非捕获分组
  15. Android仿Qzone底部导航栏加号弹出菜单
  16. selectpicker 清空选项_boostrap selectpicker 用法
  17. Windows11无法打开Windows安全中心(需要使用新应用打开此windowsdefender链接)
  18. 祁文之恋——婚纱照——准备
  19. python 中的 sys.stdin ,sys.stdout 和sys.stderr
  20. 巾帼不让须眉 IT界10大女性CEO排行

热门文章

  1. Zigbee Direct
  2. HTML5期末大作业:餐饮美食网页设计——美食网(7页) HTML+CSS+JavaScript
  3. mysql索引优化有几种_mysql索引优化
  4. 手机免费远程控制电脑,RdViewer远程管理 1.5.0,取代常常断线的TeamViewer,外网内网都能用,是你们要的一键傻瓜版!
  5. 分享一些摘抄的优美句子~(第三波)
  6. 收藏 | Python接单赚钱兼职平台推荐
  7. PC端聊天机器人界面
  8. 【Python秒杀脚本】淘宝 京东购物秒杀外挂,平台定时准点自动抢购,618薅羊毛全靠它!!
  9. Java高级技术梳理
  10. 物联网毕业设计 stm32自动泊车系统