2016-05-06 2 views
1

ここでは、 "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) 
+0

クラスが特別に設計されていない限り、オブジェクトに任意の要素を追加することは、ほとんどの場合、悪い考えです。後でひどいやり方で壊れる可能性があります。なぜあなたはこれをしたいのですか?必要があれば、スカイフィールドオブジェクトをラップする独自のコンテナクラスを作成し、持ち歩きたい属性を追加することをお勧めします。 – Iguananaut

+1

@uhohこれは名前の衝突を避けるために役立ちます(あなたは技術的に1つの属性を追加するだけです)。しかし、私はまだIguananautに同意します。スカイフィールドオブジェクトをコンストラクタで受け取り、必要な値を計算してインスタンス変数に割り当てるコンテナクラスを作成します。 – pzp

+0

@pzpそれでは、私たちはすべてそれについて合意に達しました、ありがとう!しかし、もし*私がこれを行うなら、属性名の矛盾以外にも間違っているかもしれない他のものがありますか?私が気づいていない、少し深いpythonの何か?それは私の質問です。私は良いプログラミングの提唱者ですが、私はまだ何かが間違っている可能性のために病的な好奇心を持っています。 – uhoh

答えて

1

これは確かに1が非公式Pythonコードで時折横切るパターンです。間違っている可能性があるもう一つの重要なことは、属性名の競合以外にも、何百万ものオブジェクトをより効率的に作成したい人の扇動の下で図書館の著者が__slots__仕様を追加し、追加の属性を追加します。

__slots__に対する防御は、使用するクラスの独自のサブクラスを使用することです。サブクラスが__slots__を指定するのに失敗した場合、追加する属性がなくても少なくとも__slots__ = []と言っていれば、そのサブクラスのインスタンスは広く開いていて何らかの属性を持つことができるので、常に自分のサブクラスを作成できますインスタンスを「ロック解除」し、それらのインスタンスに任意の属性を持たせることができます。 earthのようなオブジェクト

注辞書のキーになる資格ですので、あなたはすべての惑星に関連付ける情報の一部を持っている場合は、次のような何かを言うことができる:一般的なものである

positions = {} 
positions[earth] = ... 

をあなたがオブジェクトのセットのそれぞれについて覚えておくべき追加の情報を持っているとき、パターン

関連する問題