![](/img/trans.png)
[英]python: How to assign a class function result to a class variable in the same class
[英]Python : Assign value of a function result / variable to a 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,这意味着我没有来自另一种语言,并且正在读一本书。 如果没有明显可笑,请解释给出的任何答案。
非常感谢。
为了使它更清晰,我试图将用户输入的新人名称值作为对象名称(在我的例子中是newperson)
更新:
感谢所有答案,我收集它并不是一个好主意,允许用户设置变量名称,所以我重新编写了我的代码。 我创建了一个字典,在用户创建新人之后,将类str函数给出的数据写入给定名称的键。 虽然这意味着我以后无法访问该对象,因为newperson将被覆盖,它允许我构建一个包含一组数据的人员列表,这是我想要做的第一个地方,我只是错误地认为设置对象名称会更容易。 再次感谢。
如果我理解正确,你想要的是创建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
但为了完整起见,我把它包括在内。 不要用这个!
您使用的是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的书籍和教程需要不同,并且本身可能会导致一些混乱。
我不完全确定问题是什么,但是你展示的代码有些不一致。
newname
是对string
对象的引用,然后将此引用绑定到最后一行中的Person
对象。 这是糟糕的设计,因为它让读者感到困惑。 最好将您的Person
对象称为不同的东西,例如newPerson = Person( ... )
。 newname.lower()
调用newname
对象的lower()
函数 - 如果newname
仍然是一个string
,那将会有效,但现在它是一个Person
。 您是否在Person
类中定义了def lower(self)
成员函数? 课程怎么样? newname
仍然是一个string
str(newname)
是一个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
旁注:在__init__
使用raw_input
可能是一个糟糕的设计,而__str__
函数可能最好返回Person(name=%s, age=%d) % ...
,但这只是一个例子,它是如何工作的。
所有这些函数调用都返回值而不是变量,因此不能更改它们。 在数学方面,它就像试图说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 )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.