描述一个星系和描述一所学校有的思维方式是一样的,其实和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 = []
继续的话还需要提供很多方法给响应的类,以方便我们获取相应的数据。
就写到这里吧,感觉有点晕了。感觉自己也是挺闲的。