ここでは、 "OK"はもちろん、(あなた自身の責任において)AYORを意味しますが、それ以外の場合は既存の属性名との明白な衝突を避けるために予期しない問題はありません。Skyfieldオブジェクトに属性を追加するだけでいいですか?
Skyfieldオブジェクト(特に惑星)には、通常、限られた数の属性があります。テキストとして保存して後で使用する数値データを抽出する短いスクリプトを頻繁に作成しています。 これらは基本的には使い捨てのスクリプトです私はたまにそれらを2回以上使用することはほとんどなく、は決してを共有していません。
私はより耐久性のあるコードを書くとき、私は自分のコンテナオブジェクトを作成します。
私の質問:それは私のためにうまく動作しているようだ、この特定のコンテキスト内ので、属性名における紛争のほかに間違っを行くことができるものがありますか?
from skyfield.api import load
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
eph = load('de421.bsp')
earth = eph['earth']
sun = eph['sun']
ts = load.timescale()
t = ts.utc(2016, 1, np.linspace(0, 366, 1000))
# SLOPPY WAY: just add them directly
earth.pos = earth.at(t).position.km
sun.pos = sun.at(t).position.km
earth.r = np.sqrt(((earth.pos-sun.pos)**2).sum(axis=0))
earth.peri = earth.r.min()
earth.apo = earth.r.max()
print earth.peri, earth.apo, earth.pos.shape
# BETTER WAY: tedious but more cautious
uhoh = dict()
ep = earth.at(t).position.km
sp = sun.at(t).position.km
r = np.sqrt(((ep-sp)**2).sum(axis=0))
uhoh['pos'] = ep
uhoh['r'] = r
uhoh['peri'] = r.min()
uhoh['apo'] = r.max()
earth.uhoh = uhoh
print earth.uhoh['peri'], earth.uhoh['apo'], earth.uhoh['pos'].shape
リターン:
147100175.99 152103762.948 (3, 1000)
147100175.99 152103762.948 (3, 1000)
クラスが特別に設計されていない限り、オブジェクトに任意の要素を追加することは、ほとんどの場合、悪い考えです。後でひどいやり方で壊れる可能性があります。なぜあなたはこれをしたいのですか?必要があれば、スカイフィールドオブジェクトをラップする独自のコンテナクラスを作成し、持ち歩きたい属性を追加することをお勧めします。 – Iguananaut
@uhohこれは名前の衝突を避けるために役立ちます(あなたは技術的に1つの属性を追加するだけです)。しかし、私はまだIguananautに同意します。スカイフィールドオブジェクトをコンストラクタで受け取り、必要な値を計算してインスタンス変数に割り当てるコンテナクラスを作成します。 – pzp
@pzpそれでは、私たちはすべてそれについて合意に達しました、ありがとう!しかし、もし*私がこれを行うなら、属性名の矛盾以外にも間違っているかもしれない他のものがありますか?私が気づいていない、少し深いpythonの何か?それは私の質問です。私は良いプログラミングの提唱者ですが、私はまだ何かが間違っている可能性のために病的な好奇心を持っています。 – uhoh