繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM