Как назначить от входа до объекта из класса - PullRequest
0 голосов
/ 21 марта 2019

У меня есть несколько классов, и у меня есть экземпляры из каждого класса, например: класс ученика. каждый экземпляр (студент) имеет свои собственные курсы. Теперь, когда пользователь входит в систему (путем ввода), я хочу напечатать свой список курсов. Или даже просто их возраст, чтобы показать, что у меня есть правильный объект.

Есть ли лучший способ, чем eval(), получить объект из класса на основе input как в следующем примере:

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

1 Ответ

1 голос
/ 21 марта 2019

Я предполагаю, что это для образовательных целей (рабочий код будет использовать базу данных 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).

...