我對 python 類有一個奇怪的行為,這對我來說似乎不正常,你能花點時間幫助我嗎?
代碼已在python 3.9和3.6下執行。
我從同一個類中獲得了多個實體:
class Obj:
txt_list = []
txt_dictionnary = {}
txt_var = ""
def __init__(self, txt):
self.txt_list.append(txt)
self.txt_dictionnary["hello"] = txt
self.txt_var = txt
主要代碼:
if __name__ == '__main__':
Obj1 = Obj("1")
print(f"txt_list1 = {Obj1.txt_list} - txt_dictionnary1 = {Obj1.txt_dictionnary} - txt_var1 = {Obj1.txt_var}")
Obj2 = Obj("2")
print(f"txt_list1 = {Obj1.txt_list} - txt_dictionnary1 = {Obj1.txt_dictionnary} - txt_var1 = {Obj1.txt_var}")
Obj2.txt_list.append("3")
print(f"txt_list1 = {Obj1.txt_list} - txt_dictionnary1 = {Obj1.txt_dictionnary} - txt_var1 = {Obj1.txt_var}")
輸出 :
txt_list1 = ['1'] - txt_dictionnary1 = {'hello': '1'} - txt_var1 = 1
txt_list1 = ['1', '2'] - txt_dictionnary1 = {'hello': '2'} - txt_var1 = 1
txt_list1 = ['1', '2', '3'] - txt_dictionnary1 = {'hello': '2'} - txt_var1 = 1
對我來說Obj1,當我實體化和修改Obj2sinceObj1和Obj2. 我們還看到,只有簡單的變數在修改/實體化時不會改變。我是不是忘記了什么?
uj5u.com熱心網友回復:
txt_list這是一個類變數,這意味著它在類的所有實體之間共享。如果你改變它(比如使用append方法),類的所有實體都會看到變化。
為了為每個實體創建一個變數,您需要定義一個實體變數:
class Obj:
def __init__(self, txt):
self.txt_list = [txt]
self.txt_dictionnary = {'hello': txt}
self.txt_var = txt
nowtxt_list是針對單個實體的,如果您對其進行變異,其他實體將不會看到更改。
我從類主體中洗掉了這些行,但我應該提一下,只要你有這些實體變數,你就會首先得到實體變數。即使它們也被定義為類變數。
class Obj:
txt_list = []
txt_dictionnary = {}
txt_var = ""
def __init__(self, txt):
self.txt_list = [txt]
self.txt_dictionnary = {'hello': txt}
self.txt_var = txt
這就是 Python 中屬性查找的作業方式。(還有其他情況下描述符會發揮作用,但這不是我們目前關心的問題。請注意它們)
你提到:
只有簡單的變數在修改/實體化時不會改變。
那是因為字串是不可變的。你不能改變它。當您進行分配時,它不會改變物件。所以基本上你創建txt_var為實體變數。
uj5u.com熱心網友回復:
您將 、 和 宣告txt_list為txt_dictionnary類txt_var屬性。
因此,您的類的所有實體共享相同的串列和字典物件,而不是擁有自己唯一的物件。
在里面宣告你的屬性__init__():
def __init__(self, txt):
self.txt_list = [txt]
self.txt_dictionnary = { "hello": txt }
self.txt_var = txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/488786.html
