Python: присвоить значение результата функции / переменной классу - PullRequest
3 голосов
/ 17 марта 2012

Я сделал простую тестовую программу для экспериментов с использованием классов. Он создает класс «персона», который принимает аргументы имени и возраста. Сейчас я пытаюсь создать интерактивную программу, которая позволяет пользователю управлять списком людей, например, реестром или адресной книгой. Они могут создать нового человека, как показано в функции ниже.

def createnew():
    newname = input("What is their name?")
    newage = input("How old are they?")

    newperson = Person(newname, newage)

Конечно, проблема с вышесказанным заключается в том, что он присваивает newname буквально, а не строковое значение "newname". Поэтому я попытался

newperson.lower() = Person(newname, newage)
str(newperson) = Person(newname, newage)
newperson[0:] = Person(newname, newage)

но все они возвращают ошибку, не могут назначить вызов функции. У меня вопрос, как мне получить доступ к значению переменной newname и присвоить его Person или любому другому классу.

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

Большое спасибо.

Чтобы сделать его немного понятнее, я пытаюсь сделать введенное пользователем значение для имени нового человека именем объекта (в моем примере это newperson)

Обновление:

Спасибо за все ответы, я понимаю, что не очень хорошая идея разрешать пользователю задавать имена переменных, поэтому я перенастроил свой код. Я сделал словарь, который после того, как пользователь создал нового человека, записывает данные, заданные функцией класса str , в ключ данного имени. Хотя это означает, что я не смогу получить доступ к объекту позже, потому что newperson будет перезаписан, это позволяет мне составить список людей с набором данных, что я и хотел сделать в первую очередь, я просто ошибочно Я подумал, что будет проще установить имя объекта. Еще раз спасибо.

Ответы [ 4 ]

5 голосов
/ 17 марта 2012

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

Это плохо.

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

people = {}

def createnew():
    ...
    people[newname] = Person(newname, newage)

Затем вы можете получить доступ к Персоне в словаре:

print(people['name of the person'])

(я предполагаю, что вы используете Python 3, поскольку вы используете input() вместо raw_input(), как в Python 2.x)

Если вы действительно должны создать новую переменную (что плохо, поскольку имена людей обычно не являются допустимыми идентификаторами Python), используйте функцию globals():

>>> globals()['foo'] = 2
>>> foo
2

но я включаю это для полноты картины. Не используйте это!

1 голос
/ 17 марта 2012

Вы используете Python 2 или Python 3?Я предполагаю, что, возможно, ваша книга написана для Python 3, а вы используете Python 2. Я думаю, что ваша первая программа должна работать на Python 3, но в Python 2 функция input, вероятно, не делает то, что вы ожидаете,Функция raw_input была бы лучше.Дайте мне знать, какую версию Python вы используете, и я постараюсь оказать вам более конкретную помощь.Номер версии должен отображаться при каждом запуске интерпретатора Python или при запуске python -V в командной строке.

Эта версия вашего кода должна работать в Python 2:

def createnew():
    newname = raw_input("What is their name?")
    newage = int(raw_input("How old are they?"))

    person = Person(newname, newage)

Я изменил input на raw_input.Как подсказывает Voithos ниже, я использовал функцию «int» для преобразования ввода (с является строкой) в целое число.Я также изменил последнюю строку, чтобы сохранить экземпляр Person в новой переменной person вместо newname, поскольку повторное использование одной и той же переменной для двух разных типов значений может быть довольно запутанным.


Причина, по которой input дает вам удивительные результаты, становится ясной, если вы проверите документацию для этой функции:

http://docs.python.org/library/functions.html#input

Он читает ввод и затем пытается оценить его как Pythonвыражение!Когда вы вводите имя, вы получаете ошибку, потому что это не имя переменной.Потому что это довольно удивительно, и не так часто, как вы на самом деле хотите, в Python 3 они изменили его, но это означает, что книги и учебные пособия для Python 2 и 3 должны отличаться и могут сами по себе привести к некоторой путанице.

0 голосов
/ 17 марта 2012

Все эти вызовы функций возвращают значения вместо переменных, поэтому они не могут быть изменены.С точки зрения математики это все равно что пытаться сказать 2 = 7 + 4.Поскольку 2 не является переменной и на самом деле не может быть назначено / изменено таким образом, это не имеет особого смысла, и плохой переводчик трагически просит вас о помощи.Переменные, с другой стороны, как вы, вероятно, уже знаете, могут быть назначены таким образом в виде x = 7 + 4.Изменение значения, содержащегося в переменной x, прекрасно, потому что переменные содержат значения, но попытка изменить значение другого значения невозможна.

Вам нужно найти переменную, которую выхотите изменить, поместите его слева от знака равенства и поместите значение, которое вы хотите присвоить ему, справа.Когда вы говорите Person(newname, newage), вы создаете значение, в данном случае объект, который необходимо присвоить переменной, чтобы его можно было сохранить и использовать позже, а не просто мгновенно отбрасывать:

def createnew():
    newname = input("What is their name?") #remember to indent these if you want them 
    newage = input("How old are they?")    #to be part of the function!
    newPerson = Person(newname, newage) 
    return newPerson

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

class Person:
    def __init__(self, name, age):
        self.name = name      #the variable that contains the person's name is called 'name'
        self.age = age       #the variable that contains the person's age is called 'age'

def createnew():
    newname = input("What is their name?") #remember to indent these if you want them 
    newage = input("How old are they?")    #to be part of the function!
    newPerson = Person(newname, newage) 
    return newPerson

newperson = createnew() #will prompt you to enter name and age for this person and assign them

print( "person's old name: " + newperson.name )    
newperson.name = input("What's is their new name?") #second thought, you want to change Bob's name
print( "person's new name: " + newperson.name )
0 голосов
/ 17 марта 2012

Я не совсем уверен, в чем проблема, но код, который вы показываете, имеет некоторые несоответствия.

  • newname - это ссылка на объект string, затем вы привязываете эту ссылку к объекту Person в последней строке.Это плохой дизайн, потому что он смущает читателя.Лучше назвать ваш объект Person чем-то другим, например, newPerson = Person( ... ).
  • newname.lower() вызывает функцию lower() для объекта newname - это сработало бы, если бы newname все еще был string, но теперь это Person.Вы определили функцию-член def lower(self) в классе Person?Как выглядит класс?
  • str(newname) - noop, если newname по-прежнему string.Если это Person объект, вы должны определить def __str__(self) функцию-член, которая возвращает строковое представление вашего Person.

В общем, я не уверен, что вы действительно хотите,но класс Person может выглядеть так:

class Person(object):
    def __init__(self):
        self.name=raw_input("What is their name? ").capitalize()
        self.age=int(raw_input("How old are they? "))

    def __str__(self):
        return "My name is %s and I'm %d years of age." % (
            self.name, self.age)

Использование:

p=Person()
print p

Sidenote: Возможно, плохой дизайн для использования raw_input внутри __init__, и функция __str__ может лучше вернуть Person(name=%s, age=%d) % ..., но тогда это всего лишь пример того, как она работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...