我可以从Python 2.7中的文本文件创建对象名吗?
我在做一个游戏项目。 我已经创建了一个对象,星(object)。 我想从文本文件中动态地分配变量的名称 如果我有一个包含以下内容的文本文件:我可以从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) 但是,难道没有一种方法可以实现自动化吗 本质上,我最终想要的是一个包含星星
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