Python:将函数结果/变量的值赋给类

时间:2012-03-17 17:54:59

标签: python function variables

我做了一个简单的测试程序来使用类进行实验。它创造了一个“人”#34; class,它接受名称和年龄的参数。我现在正在尝试创建一个交互式程序,允许用户管理人员列表,如注册表或地址簿。他们可以创建一个新人,如下面的函数所示。

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或任何其他类。

注意:我是一个n00b / newb,意思是我没有来自另一种语言,并且正在读一本书。如果没有明显可笑,请解释给出的任何答案。

非常感谢。

为了使它更清晰,我试图让用户输入的值为新人的名称对象名称(在我的例子中是新人)

更新

感谢所有的答案,我认为允许用户设置变量名称并不是一个好主意,所以我重新编写了我的代码。我创建了一个字典,在用户创建新人之后,将类 str 函数给出的数据写入给定名称的键。虽然这意味着我以后无法访问该对象,因为新人将被覆盖,它允许我构建一个包含一组数据的人员列表,这是我首先要做的事情,我只是错误地认为设置对象名称会更容易。 再次感谢。

4 个答案:

答案 0 :(得分:5)

如果我理解正确,你想要的是创建Person对象,然后创建一个名为人的名字的全局变量。

这很糟糕。

您真正想要的是一种存储人物对象并通过其名称检索它们的方法。所以,使用字典:

people = {}

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

然后,您可以访问字典中的Person:

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

(我假设您使用的是Python 3,因为您在Python 2.x中使用input()而不是raw_input()

如果确实必须创建一个新变量(这很糟糕,因为人们的名字通常不是有效的Python标识符),请使用globals()函数:

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

但为了完整起见,我将其包括在内。不要用这个!

答案 1 :(得分:1)

您使用的是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的书籍和教程需要不同,并且本身可能会导致一些混乱。

答案 2 :(得分:0)

我不完全确定问题所在,但您展示的代码存在一些不一致之处。

  • newname是对string对象的引用,然后将此引用绑定到最后一行中的Person对象。这是糟糕的设计,因为它让读者感到困惑。最好将您的Person对象称为不同的对象,例如newPerson = Person( ... )
  • newname.lower()调用lower()对象上的newname函数 - 如果newname仍然是string,则会有效,但现在它是Person 1}}。您是否在def lower(self)课程中定义了Person成员函数?班级怎么样?
  • 如果str(newname)仍然是newname,则
  • string是noop。如果它是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

旁注:raw_input内使用__init__可能是一个糟糕的设计,而__str__函数可能最好返回Person(name=%s, age=%d) % ...,但那么这只是一个例子。

答案 3 :(得分:0)

所有这些函数调用都返回值而不是变量,因此不能更改它们。在数学术语中,它就像试图说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 )