2011-01-18 7 views
3

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

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

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

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

+0

Почему вы хотите, чтобы пользовательское имя было именем переменной? – SilentGhost

+0

Вы действительно поняли создание объектов. Вам просто нужно больше узнать о контейнерах, таких как списки, наборы и словари. –

+2

Всякий раз, когда кто-то говорит об «имени» объекта, я чувствую сильное желание добавить тэг 'confusion-of-ideas';) Объект не имеет имен. Существуют переменные, и они относятся к объектам. Но это не соотношение 1: 1 - многие переменные могут ссылаться на один объект, и объекты не должны ссылаться на переменную. Это очень разные вещи. – delnan

ответ

7

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

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) 
+1

удивительно, большое вам спасибо. –

1

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

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

person = new Person() 
person.name = "Bob" 
person.email = "[email protected]" 
person.save() # this line will write to the persistent datastore (database, flat files, etc) 

, а затем в другой сессии, вы можете:

person = Person.get_by_email("[email protected]") # assuming you had a classmethod called 'get_by_email' 
+0

Спасибо за пример ссылки. Я думал, что это будет выглядеть примерно так. –

2

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

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

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

+0

У меня уже было догадаться, что это будет так. Спасибо за объяснение, очень полезно –

1

Я постараюсь ответить как могу здесь:

  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() 

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

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 

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

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

0

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