2012-03-18 3 views
1

Я изучаю Python, следуя книге (Python Programming for Absolute Beginner, 3rd Edition). В книге приведен пример базового приложения типа Sims, в котором создано конечное число «critters», и пользователь должен кормить и играть с ними, увеличивая их скуку и голод. Я практиковал занятия и пытался сделать свою собственную игру. Пользователю было представлено меню, в котором пользователь мог; купить/создать новый сим, удалить старый или взаимодействовать с существующими. Проблема, с которой я столкнулась, заключается в создании новых классов. Сначала пользователю предлагается экран с вопросом о том, что они хотели бы сделать, и если они нажмут X, они будут перенесены в функцию createnewsim. Однако проблема в том, когда новый класс сделан:Созданные пользователем классы

nameofsim = input("what would you like to call your new sim?") 
newsim = sim(nameofsim) 

Если пользователь был сделать другой, он будет перезаписывать существующий, так как имя newsim не может быть изменен, так как я обнаружил в предыдущем вопросе, более или менее.

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

+2

Fyi, вы хотите использовать 'raw_input' вместо' input', поскольку последний оценивает строку как выражение python. – ThiefMaster

+2

, который зависит от того, используют ли они python 2.x или 3.x – Doboy

+0

В качестве примечания, это соглашение Python (см. PEP 8 - http://www.python.org/dev/peps/pep-0008/) используйте '' CamelCase'' для имен классов. –

ответ

2

Либо хранить ваши классы sim в списке или словаре; например

class Sim(object): 
    def __init__(self, name): 
     self.name = name 

names = ['tim','dave','jane'] 
sims = {} 
for name in names: 
    sims[name] = Sim(name) 
0

Jakob Bowyer уже ответил на ваш вопрос, но я думал, что добавлю примечание о переменных Python. Рассмотрим следующий код:

newSim = Sim('Bob') 

oldSim = newSim 

newSim = Sim('George') 

В этом примере, конечный результат будет oldSim = Bob и newSim = George. Обратите внимание, как объект, к которому относится переменная, не уничтожается или не перезаписывается с присвоением переменной. Единственное, что меняется, это местоположение в памяти, на которое ссылается имя переменной.

0

Вы можете сделать словарь симов как этого

sim_dict = {} 
while True: 
    nameofsim = input("what would you like to call your new sim?") 
    if nameofsim == "": 
     break 
    sim_dict[nameofsim] = Sim(nameofsim) 

Если пользователь создает сим под названием 'Дейва вы можете получить доступ к нему с помощью

sim_dict['dave'] 

Но когда вы пишете программу вы не можете догадаться, какие имена пользователь даст симам, поэтому часто вы будете обращаться к ним в таком виде

for nameofsim, sim in sim_dict.items(): 
    if sim.birthday==today: 
     sim.age+= 1 
0

Вы не предоставили достаточно кода, чтобы помочь вам в достаточной мере. Таким образом, мы не можем сказать, можно ли сохранить состояние Sim и продолжить его со свежеприготовленным. Также непонятно, что такое сим! Это целая игра или просто «тварь», как вы ее назвали?

Но в целом вы могли бы сделать отображение в словаре как:

sims = {} 
nameofsim = input("what would you like to call your new sim?") 
if nameofsim in sims: 
    newsim = sims[nameofsim] 
else: 
    newsim = sim(nameofsim) 
    sims[nameofsim] = newsim 

Это также, кажется, вы не уловили некоторые понятия здесь:

  1. классы в целом различны отличается объекты (в классах python - специальные типы объектов). Объекты относятся к классам типа отношения. Это различие важно из-за наследования и полиморфизма в объектно-ориентированных парадигмах! чемпион и мальчик - оба собаки, но чемпион - лабрадор и 2 года, а мальчик - добберман и 5 лет.поэтому оба имеют тип собака - что делает мальчика и чемпионов объектам классной собаки!
    Как вы видите, абстрактный класс собака не живет - это просто абстрактная концепция существа. Но Объекты Чемпион и boy являются живыми экземплярами класса dog!

  2. с утверждением newsim = sim(nameofsim) ваши делают следующее:

    1. создания объекта типа sim
    2. initializining его с аргументом, представленной nameofsim
    3. присваивающей этот объект в arbitray имя - > переменная newsim

, но переменная newsim is NOT объект! объект может существовать даже без собственного имени переменной. Использование переменной просто обеспечивает удобный доступ к объекту.

Смежные вопросы