2011-01-02 23 views
1

私はゲームプロジェクトに取り組んでいます。 オブジェクトStar(Object)を作成しました。 テキストファイルから変数の名前を動的に割り当てる必要があります。Python 2.7でテキストファイルからオブジェクト名を作成できますか?

私はテキストファイルがある場合:

Sol 
Centauri 
Vega 

を私はプログラムがテキストファイルから変数名とスター(オブジェクト)を作成します。数百の星を作りたいと思っているので、プロセスを自動化したい。 私は手でコードを書くことができます。

Sol = Star(Sol) 
Centauri = Star(Centauri) 
Vega = Star(Vega) 

をしかし、これを自動化する方法はありませんでしょうか?

私が最終的に望むのは、星のリストを独自のオブジェクトとして持つタプルです。次に、ゲームのメンテナンスをしているときに、タプル内のすべてのオブジェクトを繰り返し処理できます。

+1

変数の名前を動的に割り当てたいとしますが、その変数をタプルに入れたいとします。タプル要素は名前を持たず、インデックスを持ちます。名前の意味はどういう意味ですか?オブジェクトをインスタンス化してリストに追加し、そのリストを 'tuple'に渡します。 – aaronasterling

答えて

1

I want to assign the name of the variables, dynamicallyこれは、デザインが完全に間違っていることを示す非常に良い指標です。

あなたのデザインは正確には分かりませんが、代わりに辞書を使いたいと思っています。

+0

私は同意しません。それは、おそらく彼がおそらく辞書を使うべきであるということを意味します。 *動的な識別子が必要な理由がたくさんあります。 – Ponkadoodle

+0

@Wallacoloo、名前1 – aaronasterling

+0

@aaronasterling:それはまさに辞書のためのものです - 動的変数名! – Ponkadoodle

0

あなたの質問は不明です。 Pythonでは、Centauriを継承する「Star」というクラスを作成することを意味する構文「Star(Centauri)」を使用しているという事実が濁っています。私はあなたが望むものはおそらく異なる星を作るファクトリオブジェクトだと思うが、星がどう違うかについては何も言わない。おそらく、違いは場所ですが、あなたはそれがどのように扱われているかは言いません。

あなたの星の設定をYAMLファイルに入れて、pyYAMLを使ってロードすると、あなたのために用意されているPythonデータ構造体が返されます。

-1

あなたは、実行時にクラスのオブジェクトを作成するタイプのモジュールを使用することができます。

import types 

def make_class(name): 
    cls = types.ClassType(name,(), {}) 
    return cls 

cls = make_class("Star") 
obj = cls() 

を上記の例では、CLSはあなたclass Star

+0

これを行うには 'types'をインポートする必要はありません。 'type.ClassType(name、()、{})'はより標準的な 'type(name、()、{}')と同じです。レコードに関しては、タプルは基底クラスであり、dictはクラスメソッドを含む属性。 – aaronasterling

0
def makeStar(starName): 
    globals()[starName] = Star(globals()[starName]) 
makeStar("Sol") 

Sol = Star(Sol) 
と同じであるとなり

「Sol」は任意の文字列で置き換えることができます(たとえば、そのファイルから読み取られた値e)。

また、これらのグローバル変数の作り直しが必要な場合もあります。これは、必要なときにすべての星を繰り返し処理することができなくなり、名前の競合が発生する可能性があります。これらを辞書に入れたいのであれば、 "globals()"をあなたの辞書の名前に置き換えてください。

4

星の名前は、変数の名前であってはなりません。変数名は、変数が使用されているコンテキストを反映する必要があります。 destinationStarまたはhomeStar

スターの名前がStar.nameを介してアクセスStarオブジェクトのプロパティ、次のようになります。辞書に格納することにより

class Star(object): 
    """Keeps track of a star.""" 

    def __init__(self, starName): 
     self.name = starName 

    # other methods... 

def read_stars(filename): 
    # oversimplified: 
    stars = {} 
    starfile = open(filename, "r") 
    for line in starfile: 
     words = line.split() 
     if len(words) == 2 and words[0] == 'star': 
      name = words[1] 
      stars[name] = Star(name) 
    return stars 

を、あなたはstars[name]で、特定のStarを検索するか、for s in stars.values()を超えるすべての星を繰り返すことができます、 例えば。

1
class BadStar(Exception): pass 

class Star(object): 
    def __init__(self, name, mass, mag, color, x, y, z): 
     self.name = name 
     self.mass = float(mass) 
     self.mag = float(mag) 
     self.color = color 
     self.pos = (float(x),float(y),float(z)) 

    @classmethod 
    def fromstr(cls, s): 
     "Alternate constructor from string" 
     stardata = [i.strip() for i in s.split(',')] 
     if len(stardata)==7: 
      return cls(*stardata) 
     else: 
      raise BadStar("wrong number of arguments in string constructor") 

    def __str__(self): 
     x,y,z = self.pos 
     return "{0} is at ({1}, {2}, {3})".format(self.name, x, y, z) 

class StarIndex(dict): 
    def load(self, fname): 
     "Load stars from text file" 
     with open(fname, "r") as f: 
      for line in f: 
       line = line.split('#')[0] # discard comments 
       line = line.strip()   # kill excess whitespace 
       if len(line):    # anything left? 
        try: 
         star = Star.fromstr(line) 
         self[star.name] = star 
        except BadStar: 
         pass    # discard lines that don't parse 
     return self 

といくつかのサンプルデータ:

# Name,   Mass, Absolute Magnitude, Color,  x,  y,  z 
# 
# Mass is kg 
# Color is rgb hex 
# x, y, z are lightyears from earth, with +x to galactic center and +z to galactic north 
Sol,    2.0e30, 4.67,    0xff88ee, 0.0, 0.0, 0.0 
Alpha Centauri A, 2.2e30, 4.35,    0xfff5f1, -1.676, -1.360, -3.835 

その後、あなたのようなあなたのファイルを読み込むことができます。

s = StarIndex().load("stars.txt") 

print s["Sol"] 

結果

Sol is at (0.0, 0.0, 0.0) 
+0

これはよく書かれた例です、ありがとう。 – zach

0

おそらく辞書を使用してください。ディナミック変数名を作成することは可能ですが、それにアクセスするには間接参照を必要とするため意味がありません。

stars = {} 
with open("stars.txt") as stars_file: 
    for star_name in stars_file: 
     star_name = star_name.strip() 
     stars[star_name] = Star(star_name) 
関連する問題