Python 如何从输入分配到类中的对象

Python 如何从输入分配到类中的对象,python,input,eval,Python,Input,Eval,我有多个类,每个类都有实例,例如:学生类。每个实例(学生)都有自己的课程。现在,当用户登录(通过输入)时,我想打印他们的课程列表。甚至只是他们的年龄来证明我有正确的目标 有没有比eval()更好的方法基于输入从类中获取对象 如以下示例所示: class Student: def __init__(self, name, age): self._name = name self._age = age blablue = Student('bla blue', '23') na

我有多个类,每个类都有实例,例如:学生类。每个实例(学生)都有自己的课程。现在,当用户登录(通过输入)时,我想打印他们的课程列表。甚至只是他们的年龄来证明我有正确的目标

有没有比
eval()
更好的方法基于
输入从类中获取对象
如以下示例所示:

class Student:
  def __init__(self, name, age):
    self._name = name
    self._age = age

blablue = Student('bla blue', '23')
name = input('enter your name')
name = name.split(' ')
stundent = eval(name[0] + name[1])
print(student)
print(student.age)
输出:

enter your name: bla blue
<__main__.Foo object at 0x000001B2978C73C8>
23
输入您的姓名:bla blue
23

我假设这是出于教育目的(生产代码将使用SQL数据库和一些ORM):

这里的原则是为实例提供存储空间。我选择了一个
dict
,以
Foo.name
作为键进行快速查找,在现实生活中,您可能希望每个实例和多个索引都有一个不透明的唯一标识符(即一个按id、一个按名称等),但实际上在现实生活中,您将使用一个SQL数据库,该数据库已经以更优化的方式提供了所有这些功能;-)


另外,我将
dict
封装在一个专用类中,该类有自己的接口。这允许将接口与实现分离(例如,如果您以后决定需要更多的索引,而不仅仅是
name
),并封装域逻辑(即检查是否意外覆盖现有
Foo
).

您到底想实现什么?似乎您想使用用户输入选择一个类实例。也许你应该提供更多的上下文,因为这个特定的解决方案对我来说似乎不是很python。你可以按名称将所有类存储在字典中。但是如果我们有更多的上下文,可能会有更好的答案。我正在练习OOP,我想使用基于用户将输入的对象的实例属性。所以你想将输入作为名称,并将其放入Foo中,然后打印Foo的名称?
try:
    # python 2.x
    input = raw_input
except NameError:
    # python 3.x
    pass


class AlreadyExists(ValueError):
    pass


class DoesNotExist(LookupError):
    pass


class FooCollection(object):
    def __init__(self):
        self._foos = {}

    def add(self, foo):
        if foo.name in self._foos:
            raise AlreadyExists("Foo with name '{}' already exists".format(foo.name))
        self.update(foo)

    def update(self, foo):
        self._foos[foo.name] = foo    

    def get(self, name):
        try:
            return self._foos[name]
        except KeyError:
            raise DoesNotExist("no Foo named '{}'".format(name))


class Foo(object):
    def __init__(self, name, age):
        self._name = name
        self._age = age

    # we at least need to be able to read the name   
    @property
    def name(self):
        return self._name

    def __repr__(self):
        return "Foo({}, {})".format(self._name, self._age)


def main():
    foos = FooCollection()     
    blablue = Foo('bla blue', '23')
    foos.add(blablue)

    name = input('enter your name: ').strip()
    try:
        print("found {}".format(foos.get(name)))
    except DoesNotExist as e:
        print(e)

if ___name__ == "__main__":
    main()