根据用户输入更改属性

时间:2013-11-24 09:26:09

标签: python class object

好吧,我有一个有10个对象的类,它们具有self.planet,self.distance,self.distsquared,self.radius,self.diamater属性,其中distance / distsquared / radius / diamater都是整数。我想创建一个用户搜索行星名称的功能,然后更改其中一个属性。

例如,用户应输入名称“Jupiter”,然后找到该对象,该函数的下一行将要求用户向属性self.distance添加一定的总和。

目前第一堂课的设置如下:

class Planets(): 
       def __init__(self, planetName, dist, radius, diameter): 
               self.planetName= planetName 
               self.dist= dist 
               self.radius= radius 
               self.diameter= diameter

然后通过planetObjects=[Planets(*p) for p in planetList]检索这是我希望变成字典的对象列表,以便用户可以搜索planetName,并改变距离

有些用户建议我使用字典,但我不知道如何去做。目前,我的类将列表列表转换为对象列表,这些对象具有用户应该能够通过搜索Planet名称来更改的这些属性,然后更改其中一个属性。

该类目前只是一个简单的类,它有一个构造函数和一个__str__函数

意思是,功能开始,询问用户类似“你想改变哪个星球?”,用户输入“Jupiter”,程序询问“木星的距离是如何变化的?”用户添加的位置,例如450左右。

我当前的代码是一个打开infile并将其转换为列表列表的函数。然后将该列表转换为对象。我将其转换为对象,以便能够轻松地对其进行排序并根据以前的值添加新值。但此时用户还必须能够通过搜索行星名称然后更改其中一个属性来更改值 - 这就是我迷失并需要帮助的地方!

有没有办法做到这一点?提前谢谢!

2 个答案:

答案 0 :(得分:1)

在伪代码中:

class Planet(object):
    # Define your planet class here
    # any attributes that you do NOT need the user to be able to edit should start with _

Planets = [Planet('Mercury'.....
#or better
PlanetDict = {'Mercury':Planet(....

which = PromptUserForPlanet()

p = PlanetDict.get(which) # or find and return it if you didn't use a dictionary

for att in dir(p):
   if not att.startswith('_'):
      input = raw_input('%s: (%s)' % (attr, repr(getattr(p,attr)))
      if len(input) > 0:
         setattr(p,att,input) # You may wish to do some type conversion first

由于p是对词典条目的引用,因此您将更改主对象。

答案 1 :(得分:1)

鉴于您的班级Planets,这可能会像这样解决。我假设planetList的结构与此代码类似。如果不是,您可能需要稍微修改一下代码。

def increment_dist(planets):
    name = raw_input('Please enter planet name')
    try:
        planets[name].dist += int(raw_input('Increment distance by (integer)'))
    except KeyError:
        print('No planet called {}'.format(name))
    except ValueError:
        print('That is not an integer')

planetList = [('Tellus', 1, 2, 4), ('Mars', 1, 3, 9)]
planet_dict = {name: Planets(name, dist, radius, diameter) for 
               name, dist, radius, diameter in planetList}

increment_dist(planet_dict)