如何将 class 中的输入分配给对象
How to assign from input to object from a class
我有多个 class 并且每个 class 我都有实例,例如:学生 class。每个实例(学生)都有自己的课程。现在,当用户登录(通过输入)时,我想打印他们的课程列表。或者甚至只是他们的年龄来表明我有正确的对象。
基于input
从class获取对象有没有比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
我假设这是出于教育目的(生产代码将使用 SQL 数据库和一些 ORM):
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()
这里的原则是为您的实例提供存储空间。我选择 dict
以 Foo.name
作为键进行快速查找,在现实生活中,您可能希望每个实例和多个索引都有一个不透明的唯一标识符(即一个按 ID,一个按名称等) - 但实际上在现实生活中,您会使用 SQL 数据库,该数据库已经以更优化的方式提供了所有这些功能 ;-)
此外,我将 dict
包装在一个专用的 class 中,它有自己的界面。这允许将接口与实现分离(如果你后来决定你想要更多的索引而不仅仅是 name
),并且也封装域逻辑(即检查你是否不小心覆盖现有的 Foo
).
我有多个 class 并且每个 class 我都有实例,例如:学生 class。每个实例(学生)都有自己的课程。现在,当用户登录(通过输入)时,我想打印他们的课程列表。或者甚至只是他们的年龄来表明我有正确的对象。
基于input
从class获取对象有没有比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
我假设这是出于教育目的(生产代码将使用 SQL 数据库和一些 ORM):
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()
这里的原则是为您的实例提供存储空间。我选择 dict
以 Foo.name
作为键进行快速查找,在现实生活中,您可能希望每个实例和多个索引都有一个不透明的唯一标识符(即一个按 ID,一个按名称等) - 但实际上在现实生活中,您会使用 SQL 数据库,该数据库已经以更优化的方式提供了所有这些功能 ;-)
此外,我将 dict
包装在一个专用的 class 中,它有自己的界面。这允许将接口与实现分离(如果你后来决定你想要更多的索引而不仅仅是 name
),并且也封装域逻辑(即检查你是否不小心覆盖现有的 Foo
).