簡體   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