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,從頭到尾都是 引用 它,從未進行過 賦值(重定義),所以引用的都是 類屬性

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM