これは日々の作業を通して学んだことや毎日の生活で気づいたことをを記録しておく備忘録である。
HTML ファイル生成日時: 2025/04/03 13:41:35.024 (台灣標準時)
object-oriented なコードを書いたことがなかったので、 Python だとどのよ うに書くのか調べてみたでござる。以下は、その記録でござる。
"The Python Tutorial" の Section 9 に class についての説明があるの で、これを読めばよいようでござる。
まず、 class ClassName: として、新たなクラスを作るようでご ざる。そのあと、 def __init__ (self, aaa, bbb, ccc, ...): として、 __init__ メソッドを定義するようでござる。クラスオ ブジェクトが作られるときに、この __init__ メソッドが実行さ れるようでござる。それ以外のメソッドが必要であれば、やはり def で定義 すればよいようでござる。
Yale Bright Star Catalogue をダウンロードしてみるでござる。
% wget http://tdc-www.harvard.edu/catalogs/ybsc5.readme % wget http://tdc-www.harvard.edu/catalogs/ybsc5.gz
Yale Bright Star Catalogue を読んで、恒星のデータを読み込むプログラム を書いてみたでござる。
#!/usr/pkg/bin/python3.13 # # Time-stamp: <2025/03/23 00:21:51 (UT+08:00) daisuke> # # importing gzip module import gzip # Yale bright star catalogue file_ybsc5 = 'ybsc5.gz' # class Star class Star: def __init__ (self, hr, name, dm, sao, ra_str, ra_deg, dec_str, dec_deg, \ glon, glat, mag_v, colour_bv, colour_ub, colour_ri, \ sptype, parallax): self.hr = hr self.name = name self.dm = dm self.sao = sao self.ra_str = ra_str self.ra_deg = ra_deg self.dec_str = dec_str self.dec_deg = dec_deg self.glon = glon self.glat = glat self.mag_v = mag_v self.colour_bv = colour_bv self.colour_ub = colour_ub self.colour_ri = colour_ri self.sptype = sptype self.parallax = parallax # method to calculate distance in parsec def calc_dist (self): if (self.parallax > 1.0): dist_pc = -999.999 else: dist_pc = 1.0 / self.parallax return (dist_pc) # main routine if (__name__ == '__main__'): # making an empty list for storing data list_stars = [] # opening catalogue file for reading with gzip.open (file_ybsc5, mode='rb') as fh_r: # reading file line-by-line for line_byte in fh_r: # converting raw byte into UTF-8 text line = line_byte.decode ('utf-8') # extracting HR number try: hr = int (line[0:4]) except: print (f'No HR number for the following line:') print (f'{line}') continue # extracting name name = line[4:14].strip () if (name == ''): name = '__NONAME__' else: pass # extracting HD number try: dm = int (line[25:31]) except: dm = '-99999' else: pass # extracting SAO number try: sao = int (line[31:37]) except: sao = '-99999' else: pass # extracting RA ra_h = line[75:77] if (ra_h == ' '): continue else: pass ra_m = line[77:79] ra_s = line[79:83] ra_str = f'{ra_h}:{ra_m}:{ra_s}' ra_deg = (int (ra_h) + int (ra_m) / 60.0 + float (ra_s) / 3600.0) \ * 15.0 # extracting Dec dec_sign = line[83] dec_d = line[84:86] dec_m = line[86:88] dec_s = line[88:90] dec_str = f'{dec_sign}{dec_d}:{dec_m}:{dec_s}' dec_deg = int (dec_d) + int (dec_m) / 60.0 + int (dec_s) / 3600.0 if (dec_sign == '-'): dec_deg *= -1.0 else: pass # extracting galactic longitude try: glon = float (line[90:96]) except: continue # extracting galactic latitude try: glat = float (line[96:102]) except: continue # extracting visual apparent magnitude try: mag_v = float (line[102:107]) except: continue # extracting B-V colour index try: colour_bv = float (line[109:114]) except: colour_bv = -9.99 else: pass # extracting U-B colour index try: colour_ub = float (line[115:120]) except: colour_ub = -9.99 else: pass # extracting R-I colour index try: colour_ri = float (line[121:126]) except: colour_ri = -9.99 else: pass # extracting spectral type try: sptype = line[127:147].strip () except: continue # extracting parallax try: parallax = float (line[161:166]) except: parallax = 9.999 else: pass # making a class Star star = Star (hr, name, dm, sao, ra_str, ra_deg, dec_str, dec_deg, \ glon, glat, mag_v, colour_bv, colour_ub, colour_ri, \ sptype, parallax) # appending data to the end of the list list_stars.append (star) # printing very bright stars print (f'# HR number, name, V-band mag, B-V colour, parallax [arcsec], distance [pc]') for i in range (len (list_stars)): if (list_stars[i].mag_v < 1.5): print (f'{list_stars[i].hr:4d} {list_stars[i].name:10s} {list_stars[i].mag_v:5.2f} {list_stars[i].colour_bv:5.2f} {list_stars[i].parallax:6.3f} {list_stars[i].calc_dist ():8.3f}')
実行してみると以下の結果が得られたでござる。
% python3.13 test_oop_01.py # HR number, name, V-band mag, B-V colour, parallax [arcsec], distance [pc] 472 Alp Eri 0.46 -0.16 0.026 38.462 1457 87Alp Tau 0.85 1.54 0.048 20.833 1708 13Alp Aur 0.08 0.80 0.073 13.699 1713 19Bet Ori 0.12 -0.03 0.013 76.923 2061 58Alp Ori 0.50 1.85 0.005 200.000 2326 Alp Car -0.72 0.15 0.028 35.714 2491 9Alp CMa -1.46 0.00 0.375 2.667 2943 10Alp CMi 0.38 0.42 0.288 3.472 2990 78Bet Gem 1.14 1.00 0.094 10.638 3982 32Alp Leo 1.35 -0.11 0.045 22.222 4730 Alp1Cru 1.33 -0.24 0.008 125.000 4853 Bet Cru 1.25 -0.23 9.999 -999.999 5056 67Alp Vir 0.98 -0.23 0.023 43.478 5267 Bet Cen 0.61 -0.23 0.009 111.111 5340 16Alp Boo -0.04 1.23 0.090 11.111 5459 Alp1Cen -0.01 0.71 0.751 1.332 5460 Alp2Cen 1.33 0.88 0.751 1.332 6134 21Alp Sco 0.96 1.83 0.024 41.667 7001 3Alp Lyr 0.03 0.00 0.123 8.130 7557 53Alp Aql 0.77 0.22 0.198 5.051 7924 50Alp Cyg 1.25 0.09 -0.006 -166.667 8728 24Alp PsA 1.16 0.09 0.149 6.711