Python進階(三)--global和類屬性

global關鍵字

  一句話歸納爲:告訴python解釋器,global聲明的變量爲全局做用域內定義的變量。解釋器就會到全局做用域內尋找global定義的變量。python

python的類屬性

  類屬性至關於其餘OO語言的類中的靜態變量,定義在類中的屬性爲類的全部實例所共享。spa

  類屬性有兩種訪問方式:一、經過「類名.變量」的形式訪問。二、經過"類實例對象.變量"訪問。code

  

 1 #!coding:utf8
 2 
 3 class A(object):
 4     a = 1
 5     def __init__(self):
 6         pass
 7 
 8 if __name__ == '__main__':
 9     test = A()
10     print test.a
11     print A.a

結果均輸出1對象

  可是強烈建議使用類名的方式調用,緣由:一、類屬性使用類名的方式調用更加規範。二、類的實例對象在進行變量查找的時候,會先查找實例屬性(變量),而後纔會去查找類屬性。因此若實例有同名的屬性,則不會調用類屬性,則會達不到預期結果。blog

  下面你們在看看找個程序的輸出結果是什麼?作用域

結果爲:字符串

其餘的不須要過多的解釋都是很正常,按照前面的查找理論均可以解釋清楚。在這裏我想和你們講下我對類屬性__var和實例屬性self.__var的理解:it

  首先把結論和你們說下,__var類屬性和實例屬性self.__var都被python解釋器轉換爲_Test__var的名字了,因此後面在以Test.__var和t.__var的方式對其進行賦值的時候,都是向類或者對象實例中添加屬性而已,這個能夠經過dir的方式查看,如圖: class

爲何會是這樣呢?test

  我是這樣理解的,"."是一個運算符,在定義類的外部的操做過程是這樣的(純屬臆測,愛信不信:-D):在進行賦值的時候,即進行左值運算的時候,若該屬性在類中已有,則覆蓋該值,若沒有,則會建立該屬性,並進行賦值。同時建立的屬性名即爲點運算符後的變量名(所有做爲一個字符串),這樣的雙下劃線只會做爲字符串的一部分存在,沒有任何特殊意思,而在類中,下劃線會被解釋爲含有特殊意思,即在雙下劃線前加上"_類名"。總結起來感受很像一個字典操做,其實經過__dict__屬性也能夠驗證個人這個猜測,大部分的鍵即爲點後面定義的變量名,而雙下劃線卻會被轉義。

 

 歡迎你們指正,共同進步。

相關文章
相關標籤/搜索