我做了一个简单的测试程序来使用类进行实验。它创造了一个“人”#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 函数给出的数据写入给定名称的键。虽然这意味着我以后无法访问该对象,因为新人将被覆盖,它允许我构建一个包含一组数据的人员列表,这是我首先要做的事情,我只是错误地认为设置对象名称会更容易。 再次感谢。
答案 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 )