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