2 回答

TA貢獻1794條經驗 獲得超8個贊
Python 類實例是動態的 - 在您將它們放在那里之前它們沒有變量(請參見下面的注釋)。他們對這些變量應該是什么沒有任何預先了解。通常這是通過將它們一一添加(例如,self.foo = 1)__init__或類中的其他方法來完成的。但如果您有不同的變量源,則可以通過添加到 來實現self.__dict__。假設我有 CSV 文件中的一行,并且我想要一個由該行初始化的類。我可以
class P:
cell_names = ('a', 'b', 'c')
def __init__(self, row):
print("before", self.__dict__)
self.__dict__.update(zip(self.cell_names, row))
print("after", self.__dict__)
p = P((1,2,3))
print("attributes", p.a, p.b, p.c)
輸出
before {}
after {'a': 1, 'b': 2, 'c': 3}
attributes 1 2 3
當然,還有其他初始化方法。這取決于您的“整體”數據的來源是什么。
如果您想添加所有關鍵字參數,您可以
class P1:
def __init__(self, **kw):
self.__dict__.update(kw)
p = P1(a=1, b=3, c=3)
print("P2", p.a, p.b, p.c)
(注意:您可以使用__slot__在類中預定義變量。這些變量繞過實例字典)

TA貢獻1772條經驗 獲得超8個贊
_dict__
只保存實例屬性。在你的例子中是x
類屬性。是一個可以表示許多不同事物的表達方式;實際結果取決于哪個查找首先成功。y
self.x
當您進行類似 的分配時self.x = 5
,該值將與中的5
鍵相關聯。x
self.__dict__
當您嘗試獲取 的值時self.x
,首先嘗試的是self.__dict__['x']
。但如果失敗了,它會嘗試P.x
。如果失敗,它將檢查MRO 中x
每個祖先的屬性,直到找到值。P
如果沒有找到任何內容,AttributeError
則會引發 an。__getattr__
(這忽略了or的使用__getattribute__
,但足以解釋如何在為空self.x
時提供值。)self.__dict__
添加回答
舉報