python的類屬性和實例屬性

今天一同事說踩了python的坑, 這確實是個“坑”

但是我覺得python之所以這樣設計,就是明確要求寫代碼的人知道自己在寫什麼^ ^

 python的實例屬性必須在__init__(self) 方法中定義,直接跟在類名後邊定義的屬性都默認是類屬性(類似於c++的static變量)。

而python實例又可以靈活的隨便增加屬性,便出現了圖片中看似詭異的現象。

---------------------------------

我們來看一下他的原代碼:

 

你覺得輸出會是什麼?

結果是 model_path 分別是 "xx_model" 和 "oo_model"

而model_dict全都是第二次調用的結果,也就是oo_model生成的dict的值(注意,他前邊有一句self.model_dict.clear() )

 

原因是什麼呢? "坑" 就在 他是用self.xxxx 這種方式引用變量,而不是self.__class__.xxxx

(1) self.model_path=path; #這對self.model_path進行了賦值,python中的第一次賦值視爲變量的定義!

(2) self.xxxx這種格式的第一次賦值含義是什麼呢?-->含義是:定義,也就是說定義了一個名爲xxxx的實例屬性。

(3) 因此m1,m2的兩次調用,分別定義了對應的(不同的)self.model_path屬性。

     而self.model_dict,從頭到尾都是 引用 它,從未進行過 賦值(重定義),所以引用的都是 類屬性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章