我可以从Python 2.7中的文本文件创建对象名吗?

我可以从Python 2.7中的文本文件创建对象名吗?,python,object,python-2.x,Python,Object,Python 2.x,我在做一个游戏项目。 我已经创建了一个对象,星(object)。 我想从文本文件中动态地分配变量的名称 如果我有一个包含以下内容的文本文件: Sol Centauri Vega 我希望程序从文本文件中创建具有变量名的星形(对象)。我希望这个过程自动化,因为我希望创造数百颗星星。 我可以手工写出代码: Sol = Star(Sol) Centauri = Star(Centauri) Vega = Star(Vega) 但是,难道没有一种方法可以实现自动化吗 本质上,我最终想要的是一个包含星星

我在做一个游戏项目。 我已经创建了一个对象,星(object)。 我想从文本文件中动态地分配变量的名称

如果我有一个包含以下内容的文本文件:

Sol
Centauri
Vega
我希望程序从文本文件中创建具有变量名的星形(对象)。我希望这个过程自动化,因为我希望创造数百颗星星。 我可以手工写出代码:

Sol = Star(Sol)
Centauri = Star(Centauri)
Vega = Star(Vega)
但是,难道没有一种方法可以实现自动化吗


本质上,我最终想要的是一个包含星星列表的元组,作为它们自己的对象。然后,当我进行游戏维护时,我可以迭代元组中的所有对象。

我想动态地分配变量的名称。
这很好地表明您的设计是完全错误的


很难确切地知道您的设计是什么,但我想您应该使用字典来代替。

我想动态地分配变量的名称,这很好地表明您的设计是完全错误的


很难确切知道你的设计是什么,但我猜你想用字典来代替。

你的问题不清楚。使用语法“Star(Centauri)”(在Python中,这意味着要创建一个名为“Star”的类,该类继承自Centauri),这一事实给它蒙上了阴影。我想你想要的可能是一个制造不同恒星的工厂物体,但是你不会说任何关于恒星可能有什么不同的东西。想必,区别在于位置,但你也不会说这是如何处理的


根据猜测,最好的办法可能是将star配置放在YAML文件中,并使用它来加载它,这将返回一个准备就绪的Python数据结构

你的问题不清楚。使用语法“Star(Centauri)”(在Python中,这意味着要创建一个名为“Star”的类,该类继承自Centauri),这一事实给它蒙上了阴影。我想你想要的可能是一个制造不同恒星的工厂物体,但是你不会说任何关于恒星可能有什么不同的东西。想必,区别在于位置,但你也不会说这是如何处理的


根据猜测,最好的办法可能是将star配置放在YAML文件中,并使用它来加载它,这将返回一个准备就绪的Python数据结构

您可以使用类型模块在运行时创建类对象:

import types

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

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

在上面的示例中,cls成为您的
类星型

您可以使用类型模块在运行时创建类对象:

import types

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

cls = make_class("Star")
obj = cls()
def makeStar(starName):
    globals()[starName] = Star(globals()[starName])
makeStar("Sol")
在上面的示例中,cls将成为您的
班级之星

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

Sol = Star(Sol)
除了“Sol”可以替换为任何字符串(例如从该文件中读取的值)

此外,您可能需要重新考虑使用这些全局变量-如果需要,它会阻止您遍历所有星星,并且可能会导致命名冲突。如果您希望这些内容出现在词典中,那么只需将“globals()”替换为词典的名称即可

Sol = Star(Sol)
除了“Sol”可以替换为任何字符串(例如从该文件中读取的值)


此外,您可能需要重新考虑使用这些全局变量-如果需要,它会阻止您遍历所有星星,并且可能会导致命名冲突。如果您想将这些内容放在字典中,那么只需将“globals()”替换为字典的名称。

星的名称不应是变量的名称。变量名称应反映变量使用的上下文,例如
destinationStar
homeStar

星号的名称应该是
star
对象的属性,通过
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

通过在字典中存储,您可以使用
stars[name]
搜索特定的
Star
,或者使用
在stars.values()
中迭代所有的星。

例如,星的名称不应该是变量的名称。变量名称应反映变量使用的上下文,例如
destinationStar
homeStar

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
星号的名称应该是
star
对象的属性,通过
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
例如,通过在字典中存储,您可以使用
stars[name]
搜索特定的
Star
,或者使用
在stars.values()
中迭代所有的星

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")

导致

Sol is at (0.0, 0.0, 0.0)
以及一些样本数据:

# 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")

导致

Sol is at (0.0, 0.0, 0.0)

你可能应该用字典来解释。可以创建dinamic变量名,但这毫无意义,因为要访问它,无论如何都需要一个间接引用

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)

你可能应该用字典来解释。可以创建dinamic变量名,但这毫无意义,因为要访问它,无论如何都需要一个间接引用

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)

您无需导入
类型
即可执行此操作<代码>类型。类类型(名称,(),{})与更规范的
类型(名称,(),{}
相同。对于记录,元组是基类,dict是包括方法在内的类属性。您不需要导入
类型。
类型。类类型(名称,(),{})与
类型(名称,(), {}
哪一个更规范。请注意,元组是基类,dict是包含方法的类属性。我不同意。这只是意味着他可能应该使用字典。你可能需要动态标识符有很多很好的理由…@aaronasterling:字典正是用于动态变量的名字!@aaronasterling:哦,但这是你要的:t