python - 類 類對象 賦值后的分別變化,及刪除后為什么還有值
問題描述
class CC:? ? def setXY(self,x,y):? ? ? ? self.x=x? ? ? ? self.y=y? ? def printXY(self):? ? ? ? print(self.x,self.y)dd=CC()print(dd.__dict__) ? ? ? ? ? ? ? ? ? ? ? ? # {} ?#對象CC()的所有成員print(CC.__dict__) ? ? ? ? ? ? ? ? ? ? ? #{’__weakref__’: <attribute ’__weakref__’ of ’CC’ objects>, ’__doc__’: None, ’__dict__’: <attribute ’__dict__’ of ’CC’ objects>, ’printXY’: <function CC.printXY at 0x0000000000A50268>, ’__module__’: ’__main__’, ’setXY’: <function CC.setXY at 0 ? #輸出類CC的所有成員dd.setXY(4,5)print(dd.__dict__) ? ? ? ? ? ? ? ? ? ? ? #{’y’: 5, ’x’: 4}#賦值后類對象有值了print(CC.__dict__) ? ? ? ? ? ? ? ? ? ? ? #{’printXY’: <function CC.printXY at 0x0000000001160268>, ’__module__’: ’__main__’, ’__dict__’: <attribute ’__dict__’ of ’CC’ objects>, ’__weakref__’: <attribute ’__weakref__’ of ’CC’ objects>, ’__doc__’: None, ’setXY’: <function CC.setXY at 0x00000000011601E0>}#賦值后沒變del CC#ee=CC() ? NameError: name ’CC’ is not defineddd.printXY() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 4 5
第一點是那個self的作用,第二點是為賦值后撒類對象變化了而類卻沒變
問題解答
回答1:python中一切皆對象,class也是對象的一種,
如上圖,當你實例化CC以后,內存中就有了兩個對象(綠色字是對象內部的屬性和方法),一個是CC,一個是dd,
當你執行dd.setXY(4,5)時,self就被設置為dd,因為setXY不存在于dd中,所以解釋器沿著父類往上找,在CC中找到了setXY并執行,self,即dd內部就多了兩個成員x和y,
解釋器是怎么知道dd的父類是CC呢?答案是,dd.__class__
當你刪除了CC以后,其實你只是刪除了CC這個變量而已,,并沒有刪除類CC所占有的內存,因為dd還依舊存在的,dd還通過屬性__class__引用著類CC(python內存管理是基于引用計數的)
因此只是無法通過變量CC找到類而已,但是你可以通過dd.__class__找到,
因此,你可以這樣寫,ee = dd.__class__()
