2 回答

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
Python 類實(shí)例是動(dòng)態(tài)的 - 在您將它們放在那里之前它們沒有變量(請(qǐng)參見下面的注釋)。他們對(duì)這些變量應(yīng)該是什么沒有任何預(yù)先了解。通常這是通過將它們一一添加(例如,self.foo = 1)__init__或類中的其他方法來完成的。但如果您有不同的變量源,則可以通過添加到 來實(shí)現(xiàn)self.__dict__。假設(shè)我有 CSV 文件中的一行,并且我想要一個(gè)由該行初始化的類。我可以
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
當(dāng)然,還有其他初始化方法。這取決于您的“整體”數(shù)據(jù)的來源是什么。
如果您想添加所有關(guān)鍵字參數(shù),您可以
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__在類中預(yù)定義變量。這些變量繞過實(shí)例字典)

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