1. 程式人生 > >二十、面向物件2— 隱藏屬性、私有屬性、私有方法、__del__ 等四種如何使用、測量物件的引用個數

二十、面向物件2— 隱藏屬性、私有屬性、私有方法、__del__ 等四種如何使用、測量物件的引用個數

一、隱藏屬性

在一個方法裡面去規範傳遞的屬性值。(更安全),為每一個屬性新增set   get 方法

二、私有屬性

1、在外部使用私有成員的名字時,會提示找不到。

2、例如self.__age = 0 以兩個下劃線開頭叫私有屬性

3、私有屬性不能在外部直接使用,直接列印會報錯,找不到屬性

4、私有方法不能在外部直接使用

三、私有方法

1、在外部使用私有成員的名字時,會提示找不到。

2、私有方法不能在外部直接使用。

四、私有屬性或是私有的方法怎麼用

總體來說:在自己的類中,公開方法呼叫私有方法,在外部呼叫公開方法去執行。

1、私有方法使用:在公開的方法呼叫私有的

2、私有屬性怎麼使用

五、__del__方法

__init__建立完物件後會自動被呼叫

__str__當列印一個物件的時候,預設顯示的是這個物件的記憶體地址,在一個類裡面定義上該方法以後,再去列印這個物件的時候,顯示的內容就是這個方法裡面的內容。

__del__當物件被刪除時,會自動被呼叫(注意:有情況)。不太準確,下面自己總結:

(1)注意:

__init__方法是在呼叫Dog()類,也就是通過Dog去開闢新的空間時才會去執行的,對於將一個物件的引用地址給了另外一個物件時,不會去呼叫__init__方法,所以只有一次。

(2)執行原理:必須知道:

1、一旦通過類去建立物件的時候,才會開闢記憶體空間,而dog2不會開闢記憶體空間,也指向dog1的記憶體空間    ——專業叫做引用

2、dog2=dog1                dog2也指向dog1記憶體,把記憶體地址給了dog2

3、del dog1                     只是刪除了dog1引用的線,不是刪除了整個記憶體

自己總結:

1、如果當程式結束的時候還有引用數(這時候dog1、dog2還在指著記憶體空間),就先執行程式結束的程式碼(打印出50個等號),再去呼叫__del__方法(打印出over)。

2、如果程式結束的時候還有引用數,即使使用了del dog1(這時候只是dog1不再指向記憶體的引用,刪除了引用的線,不是刪除了整個記憶體,dog2這時候還在指向記憶體地址
),也不會立即呼叫__del__,也是先執行程式結束的程式碼(打印出50個=號),再去呼叫__del__方法(打印出over)。

3、如果程式結束的時候引用數為0,就直接呼叫了__del__方法,然後,再執行結束的程式碼。

六、測量物件的引用個數

測量出來跟t這個物件是同一個引用地址的數量

1、這個getrefcount()方法測量出來的個數要比實際個數多1個。所以出現結果為2

2、因為不管是t還是tt這兩個物件所指向的記憶體地址是一樣的,所以使用t或是tt也是可以的。

3、都刪除了以後,就都會報錯了