Создание объектов во время выполнения в Python - PullRequest
3 голосов
/ 18 января 2011

У меня проблема с пониманием концепции ООП, когда речь идет о создании объектов во время выполнения. Весь образовательный код, который я изучил, определяет конкретные переменные, например, «Боб» и назначает их новому экземпляру объекта. Боб = Персона ()

Что мне сейчас трудно понять, так это то, как я буду проектировать модель, которая создает новый объект во время выполнения? Я знаю, что моя формулировка, вероятно, неверна, поскольку все объекты генерируются во время выполнения, но я имею в виду, что если бы я запускал свое приложение в терминале или пользовательском интерфейсе, как бы я создавал новые объекты и управлял ими. Я не могу действительно определить новые имена переменных на лету, верно?

Примером приложения, в котором я столкнулся с этой проблемой проектирования, была бы база данных, хранящая людей. Пользователь получает меню терминала, которое позволяет ему создать нового пользователя и назначить имя, зарплату, должность. Как бы вы создали этот объект, а затем вызвали его, если хотите управлять им, вызывать функции и т. Д.? Какой здесь шаблон дизайна?

Пожалуйста, извините за плохое понимание модели OPP. В настоящее время я читаю на уроках и ООП, но я чувствую, что мне нужно понять, в чем моя ошибка, прежде чем двигаться дальше. Пожалуйста, дайте мне знать, если есть что-то, что я должен уточнить.

Ответы [ 5 ]

7 голосов
/ 18 января 2011

Такие вещи, как списки или словари, отлично подходят для хранения динамически генерируемых наборов значений / объектов:

class Person(object):
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        print "A person named %s" % self.name

people = {}
while True:
    print "Enter a name:",
    a_name = raw_input()

    if a_name == 'done':
        break

    people[a_name] = Person(a_name)

    print "I made a new Person object. The person's name is %s." % a_name

print repr(people)
2 голосов
/ 18 января 2011

Вы не храните каждый объект с именем переменной.Имена переменных для удобства программиста.

Если вам нужна коллекция объектов, вы используете только эту - коллекцию.Используйте список или словарь, содержащий экземпляры объектов, на которые ссылаются соответственно индекс или ключ.

Так, например, если у каждого сотрудника есть номер сотрудника, вы можете хранить их в словаре с номером сотрудника в качестве ключа.

1 голос
/ 18 января 2011

Я постараюсь ответить как можно лучше здесь:

  1. То, о чем вы спрашиваете, это имена переменных переменных - этого нет в Python.(Я думаю это в VB.Net, но не держу меня на этом)

Пользователь получает меню терминала, которое позволяет ему создать нового пользователя иназначить имя, зарплату, должность.Как бы вы создали этот объект, а затем вызвали его, если хотите управлять им, вызывать функции и т. Д.?Какой здесь шаблон дизайна?

Вот как я могу добавить нового человека (пример Микки-Мауса):

# Looping until we get a "fin" message
while True:
    print "Enter name, or "fin" to finish:"
    new_name = raw_input()
    if new_name == "fin":
        break
    print "Enter salary:"
    new_salary = raw_input()
    print "Enter position:"
    new_pos = raw_input()

    # Dummy database - the insert method would post this customer to the database
    cnn = db.connect()
    insert(cnn, new_name, new_salary, new_pos)
    cnn.commit()
    cnn.close()

Хорошо, теперь вы хотите получитьчеловек из базы данных.

while True:
    print "Enter name of employee, or "fin" to finish:"
    emp_name = raw_input()
    if emp_name == "fin":
        break
    # Like above, the "select_employee" would retreive someone from a database
    cnn = db.connect()
    person = select_employee(cnn, emp_name)
    cnn.close()

    # Person is now a variable, holding the person you specified:
    print(person.name)
    print(person.salary)
    print(person.position)

    # It's up to you from here what you want to do

Это просто грубый пример, но я думаю, вы понимаете, о чем я.

Кроме того, как вы видите, я нене используйте здесь класс.Класс для чего-то подобного всегда был бы лучшей идеей, но это было просто для демонстрации того, как вы будете изменять и использовать переменную во время выполнения.

1 голос
/ 18 января 2011

Для вашего примера вы хотите использовать абстракцию модели.

Если Person является классом модели, вы можете просто сделать:

person = new Person()
person.name = "Bob"
person.email = "bob@aol.com"
person.save()  # this line will write to the persistent datastore (database, flat files, etc)

и затем в другом сеансе,Вы могли бы:

person = Person.get_by_email("bob@aol.com") # assuming you had a classmethod called 'get_by_email'
0 голосов
/ 18 января 2011

Вы бы никогда не сделали Bob = Person() в реальной программе.Любой пример, который показывает, что это, возможно, плохой пример;это по сути жесткое кодирование.Вы будете чаще (в реальном коде) делать person = Person(id, name) или что-то в этом роде, чтобы построить объект, используя данные, полученные вами в другом месте (чтение из файла, интерактивное получение от пользователя и т. Д.).Еще лучше было бы что-то вроде employee = Person(id, name).

...