Я предполагаю, что это для образовательных целей (рабочий код будет использовать базу данных 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
, в реальной жизни вам, вероятно, понадобится непрозрачный уникальный идентификатор для каждого экземпляра и несколько индексов (то есть один за идентификатором, один по имени и т. Д.), Но на самом деле в в реальной жизни вы бы использовали базу данных SQL, которая уже предоставляет все эти функции гораздо более оптимизированным способом; -)
Кроме того, я обернул dict
в отдельный класс с его собственным интерфейсом. Это позволяет отделить интерфейс от реализации (если позже вы решите, что хотите больше индексов, чем, например, name
), а также инкапсулировать доменную логику (т. Е. Проверить, что вы случайно не перезаписали существующий Foo
).