2011-01-02 12 views
1

Ich arbeite an einem Spielprojekt. Ich habe ein Objekt, Stern (Objekt) erstellt. Ich möchte den Namen der Variablen dynamisch aus einer Textdatei zuweisen.Kann ich Objektnamen aus einer Textdatei in Python 2.7 erstellen?

Wenn ich eine Textdatei mit:

Sol 
Centauri 
Vega 

ich das Programm will den Star (Object) mit Variablennamen aus der Textdatei zu erstellen. Ich möchte den Prozess automatisieren, weil ich Hunderte von Sternen erstellen möchte. konnte ich den Code aus von Hand schreiben:

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

Aber gibt es nicht eine Möglichkeit, dies zu automatisieren?

Im Grunde möchte ich schließlich ein Tupel mit der Liste der Sterne, als ihre eigenen Objekte. Dann, wenn ich die Spielwartung mache, kann ich einfach über alle Objekte im Tupel iterieren.

+1

Sie sagen, dass Sie den Namen der Variablen dynamisch zuweisen möchten, aber dann sagen Sie, dass Sie sie in einem Tupel möchten. Tupel-Elemente haben keine Namen, sie haben Indizes. Also was ist es wichtig, wie der Name ist? Einfach das Objekt instanziieren und an eine Liste anhängen und diese Liste an 'tuple' übergeben. – aaronasterling

Antwort

1

I want to assign the name of the variables, dynamically Dies ist ein sehr gutes Indiz dafür, dass Ihr Design völlig falsch ist.

Es ist schwer zu wissen, was genau Ihr Design ist, aber ich rate, dass Sie stattdessen ein Wörterbuch verwenden möchten.

+0

Ich stimme nicht zu. Es bedeutet nur, dass er wahrscheinlich ein Wörterbuch benutzen sollte. Es gibt * viele * gute Gründe, warum Sie dynamische Bezeichner benötigen ... – Ponkadoodle

+0

@Wallacoloo, Name eins. – aaronasterling

+0

@aaronasterling: Genau dafür sind Wörterbücher - dynamische Variablennamen! – Ponkadoodle

0

Ihre Frage ist nicht klar. Es wird durch die Tatsache getrübt, dass Sie die Syntax "Stern (Centauri)" verwenden, was in Python bedeutet, dass Sie eine Klasse namens "Stern" erstellen möchten, die von Centauri erbt. Ich denke, was du willst, ist wahrscheinlich ein Fabrikobjekt, das verschiedene Sterne erzeugt, aber dann sagst du nichts darüber, wie sich die Sterne unterscheiden könnten. Vermutlich ist der Unterschied der Standort, aber Sie sagen auch nicht, wie damit umgegangen wird.

Die beste Wette, basierend auf Vermutungen, könnte sein, Ihre Sternkonfigurationen in eine YAML-Datei zu setzen und pyYAML zu verwenden, um eine Python-Datenstruktur bereitzustellen, die für Sie bereit ist.

-1

Sie können die Typen Modul verwenden Klassenobjekte zur Laufzeit zu erstellen:

import types 

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

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

In dem obigen Beispiel wird cls Ihre class Star

+0

Sie müssen nicht 'Typen' importieren, um dies zu tun. 'types.ClassType (name,(), {})' ist das gleiche wie 'type (name,(), {}' was kanonisch ist.Für den Datensatz sind das Tupel die Basisklassen und das dict ist die Klasse Attribute einschließlich Methoden – aaronasterling

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

die gleiche wie

ist
Sol = Star(Sol) 

mit Ausnahme von "Sol" kann durch eine beliebige Zeichenfolge ersetzt werden (z. B. die Werte, die von diesem Fil eingelesen werden e).

Sie sollten auch überdenken, diese globalen Variablen zu machen - es verhindert, dass Sie bei Bedarf alle Sterne durchlaufen können und Namenskonflikte verursachen könnten. Wenn Sie möchten, dass diese Wörter in einem Wörterbuch vorhanden sind, ersetzen Sie einfach "globals()" durch den Namen Ihres Wörterbuchs.

4

Der Name eines Sterns sollte nicht der Name der Variablen sein. Variablennamen sollten den Kontext widerspiegeln, in dem die Variable verwendet wird, z. destinationStar oder homeStar.

den Namen eines Stars eine Eigenschaft des Star Objekt sein sollte, zugegriffen über Star.name:

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 

Indem wir in einem Wörterbuch gespeichert haben, können Sie für einen bestimmten Star mit stars[name] suchen oder iterieren alle Sterne mit for s in stars.values() , beispielsweise.

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 

und einige Beispieldaten:in

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

und

print s["Sol"] 

Ergebnisse:

# 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 

dann können Sie Ihre Datei wie laden

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

Dies ist gut geschrieben Beispiel, danke. – zach

0

Sie sollten wahrscheinlich ein Wörterbuch dafür verwenden. Es ist zwar möglich, dynamische Variablennamen zu erstellen, dies würde aber keinen Sinn ergeben, denn um darauf zuzugreifen, müsste man sowieso einen indirekten Verweis haben.

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) 
Verwandte Themen