__dict__與dir()的區(qū)別:
dir()是一個函數(shù),返回的是list;
__dict__是一個字典,鍵為屬性名,值為屬性值;
dir()用來尋找一個對象的所有屬性,包括__dict__中的屬性,__dict__是dir()的子集;
實例的__dict__僅存儲與該實例相關(guān)的實例屬性,
正是因為實例的__dict__屬性,每個實例的實例屬性才會互不影響。
類的__dict__存儲所有實例共享的變量和函數(shù)(類屬性,方法等),類的__dict__并不包含其父類的屬性。
dir()函數(shù)
? dir()是Python提供的一個API函數(shù),dir()函數(shù)會自動尋找一個對象的所有屬性(包括從父類中繼承的屬性)。
? 一個實例的__dict__屬性僅僅是那個實例的實例屬性的集合,并不包含該實例的所有有效屬性。所以如果想獲取一個對象所有有效屬性,應(yīng)使用dir()。
結(jié)論
dir()函數(shù)會自動尋找一個對象的所有屬性,包括__dict__中的屬性。
__dict__是dir()的子集,dir()包含__dict__中的屬性。
1) 內(nèi)置的數(shù)據(jù)類型沒有__dict__屬性
2) 每個類有自己的__dict__屬性,就算存著繼承關(guān)系,父類的__dict__ 并不會影響子類的__dict__
3) 對象也有自己的__dict__屬性, 存儲self.xxx 信息,父子類對象公用__dict__
__getattr__與__setattr__區(qū)別:
結(jié)論
__getattr__為內(nèi)置方法,當(dāng)使用點號獲取實例屬性時,如果屬性不存在就自動調(diào)用__getattr__方法
__setattr__當(dāng)設(shè)置類實例屬性時自動調(diào)用,如j.name=5 就會調(diào)用__setattr__方法? self.[name]=5