先看問題代碼:
代碼一:
class AddrBookEntry(object): foo = 3 def __init__(self, nm, ph): self.name = nm self.phone = ph def updatePhone(self, newph) : self.phone = newph 代碼二:class AddrBookEntry(object): foo = 3 def __init__(self, nm, ph): self.name = nm self.phone = ph def updatePhone(self, newph) : self.phone = newph print 'UpDate phone# for:', self.namea = AddrBookEntry('Tony',136)print a.fooprint AddrBookEntry.fooAddrBookEntry.foo += 2print a.fooprint AddrBookEntry.foo代碼一運行結果為:3,3,4,5
代碼二結果為:3,3,5,5
代碼二中實例a的foo數據隨類的變化而變化,而代碼一中,我們先修改了實例a的foo屬性,再修改類屬性,結果a和類之間的數據不互相干擾了。
我們在代碼二輸出下a的屬性字典,即a.__dict__(),可以發現其返回值為{'phone': 136, 'name': 'Tony'},并沒有foo這個屬性,
而AddBookEntry.__dict__返回值為
{'__module__': '__main__', '__del__': <function __del__ at 0x03439870>, 'updatePhone': <function updatePhone at 0x03439930>, '__dict__': <attribute '__dict__' of 'AddrBookEntry' objects>, 'foo': 3, '__weakref__': <attribute '__weakref__' of 'AddrBookEntry' objects>, '__doc__': None, '__init__': <function __init__ at 0x034398F0>}
總結:可以這么認為,調用或訪問實例的屬性,首先解釋器會從實例的__dict__字典去查找,若沒有找到相應的屬性,則去實例化它的類的__dict__字典中查找該屬性,若依舊沒有,則raise AttributeError錯誤
擴展:大家也可以發現實例a的__dict__中并沒有方法等東西,如果我們沒有在__init__中預先給它添加了屬性,那實例a僅僅是一個實例,沒有任何的屬性和方法,同時也說明了實例可以像類一樣當做一個特殊名稱空間進行數據存放。
剩下的不多說,自己體會可能會更好
新聞熱點
疑難解答