# 自己的宇宙自己建 - 從astropy.cosmology模組中學物件導向

## 觀察astropy.cosmology模組中內建的宇宙物件

``````

In [1]:

from astropy.cosmology import WMAP9, Planck15  # 從astropy.cosmology中引入兩個內建的宇宙物件
print(WMAP9)        # WMAP9是以FlatLambdaCDM類別所產生的一個內建物件
print(Planck15)     # Planck15是以FlatLambdaCDM類別所產生的另一個內建物件
print(WMAP9.H0)     # WMAP9物件的H0屬性
print(Planck15.Om0) # Planck15物件的Om0屬性
print(WMAP9.luminosity_distance(1.5))               # WMAP9物件中用以計算luminosity_distance的方法
print(Planck15.comoving_distance([0.5, 1.0, 1.5]))  # Planck15物件中用以計算comoving_distance的方法

``````
``````

FlatLambdaCDM(name="WMAP9", H0=69.3 km / (Mpc s), Om0=0.286, Tcmb0=2.725 K, Neff=3.04, m_nu=[ 0.  0.  0.] eV, Ob0=0.0463)
FlatLambdaCDM(name="Planck15", H0=67.7 km / (Mpc s), Om0=0.307, Tcmb0=2.725 K, Neff=3.05, m_nu=[ 0.    0.    0.06] eV, Ob0=0.0486)
69.32 km / (Mpc s)
0.3075
11129.368906 Mpc
[ 1945.56133293  3395.90552491  4479.04554197] Mpc

``````

## 使用不同的宇宙類別(模型)來產生不同的宇宙物件

``````

In [2]:

from astropy.cosmology import FlatLambdaCDM  # 從astropy.cosmology中引入內建的FlatLambdaCDM宇宙類別(模型)
my_universe1 = FlatLambdaCDM(name='MyUniverse1', H0=70, Om0=0.3)       # 利用FlatLambdaCDM類別來產生一個宇宙物件
print(my_universe1)
print(my_universe1.luminosity_distance(5))
print(my_universe1.age([0.5, 1, 1.5]))

``````
``````

FlatLambdaCDM(name="MyUniverse1", H0=70 km / (Mpc s), Om0=0.3, Tcmb0=2.725 K, Neff=3.04, m_nu=[ 0.  0.  0.] eV, Ob0=None)
46638.0700856 Mpc
[ 8.42128047  5.74698053  4.19645402] Gyr

``````
``````

In [3]:

from astropy.cosmology import LambdaCDM       # 從astropy.cosmology中引入內建的LambdaCDM宇宙類別(模型)
my_universe2 = LambdaCDM(name='MyUniverse2', H0=70, Om0=0.3, Ode0=0.7)  # 利用LambdaCDM類別來產生一個宇宙物件
print(my_universe2)
print(my_universe2.luminosity_distance(5))
print(my_universe2.age([0.5, 1, 1.5]))

``````
``````

LambdaCDM(name="MyUniverse2", H0=70 km / (Mpc s), Om0=0.3, Ode0=0.7, Tcmb0=2.725 K, Neff=3.04, m_nu=[ 0.  0.  0.] eV, Ob0=None)
46637.341966 Mpc
[ 8.42156575  5.74716698  4.19657564] Gyr

``````

## 從以上例子我們學到了什麼?

• 類別(class)是用以產生多個具有共通屬性(attribute)和方法(method)的物件(object)的模型
• 屬於同個類別的不同物件， 其屬性能有相同或不同的值

例如: WMAP9, Planck15和my_universe1都是由FlatLambdaCDM類別(模型)所產生的物件，在共通的屬性中，Tcmb0有相同的值，H0則是不同的值

``````

In [4]:

print(WMAP9)
print(Planck15)
print(my_universe1)

``````
``````

FlatLambdaCDM(name="WMAP9", H0=69.3 km / (Mpc s), Om0=0.286, Tcmb0=2.725 K, Neff=3.04, m_nu=[ 0.  0.  0.] eV, Ob0=0.0463)
FlatLambdaCDM(name="Planck15", H0=67.7 km / (Mpc s), Om0=0.307, Tcmb0=2.725 K, Neff=3.05, m_nu=[ 0.    0.    0.06] eV, Ob0=0.0486)
FlatLambdaCDM(name="MyUniverse1", H0=70 km / (Mpc s), Om0=0.3, Tcmb0=2.725 K, Neff=3.04, m_nu=[ 0.  0.  0.] eV, Ob0=None)

``````
• 物件的方法如同函式(function), 但它們可以直接在內部存取物件的屬性

例如: 我們可用WMAP9, Planck15, my_universe1這三個物件共有的方法luminosity_distance來計算所屬的光度距離, 但只要輸入紅移值, 不用輸入計算過程中所需的物理量, 像是H0

``````

In [5]:

print(WMAP9.luminosity_distance([0.5, 1, 1.5]))
print(Planck15.luminosity_distance([0.5, 1, 1.5]))
print(my_universe1.luminosity_distance([0.5, 1, 1.5]))

``````
``````

[  2874.10413541   6726.14128666  11129.36890604] Mpc
[  2918.34199939   6791.81104983  11197.61385493] Mpc
[  2832.80666912   6607.05290608  10908.21504547] Mpc

``````
• 某物件是某類別的一個實例(instance)

例如: 內建的WMAP9物件是FlatLambdaCDM類別的一個實例

``````

In [6]:

print(WMAP9.__doc__)

``````
``````

WMAP9 instance of FlatLambdaCDM cosmology

(from Hinshaw et al. 2013, ApJS, 208, 19, doi: 10.1088/0067-0049/208/2/19. Table 4 (WMAP9 + eCMB + BAO + H0, last column))

``````
• 子父類別間的繼承(inheritance)可讓程式開發者定義類別時避免重複定義不同類別間相同的屬性和方法, 而且能複寫或新增屬性和方法

例如: 在astropy.cosmology模組中, 開發者先定義一個用以描述均勻且均向的宇宙類別FLRW, 該類別中定義了所屬物件共通的屬性和方法, 像是luminosity_distance(), 當開發者要進一步定義FLRW中的一個特例類別LambdaCDM(均勻且均向的宇宙, 且考慮宇宙常數和曲率的類別)時, 無需重複定義共通的屬性和方法, 只需針對特例點來複寫或新增屬性和方法。 同樣的繼承關係也適用於LambdaCDM的特例類別FlatLambdaCDM(均勻且均向的宇宙, 考慮宇宙常數但曲率為零的類別)。