《c++中的this和python的self對比》基本都是針對函式而言的,從變數的角度看,也有相同之處。
c++中,類中定義的變數一般叫做成員變數,或者說是成員屬性,它只屬於例項物件,只有例項物件才能用。加上了static關鍵字才是給類用的 稱之為靜態變數。
而python不同,例項物件呼叫屬性時,首先是看自身是否已經構建了該屬性,如果有就用,如果沒有還會去類屬性裡找, 如果類裡有,會直接自動建立乙個和類名相同的變數(不會報錯,而是自動建立乙個同名而沒有關係的變數)。初始值和該類屬性相同。
#實驗例子:print(type(stack))class
stack:
y = 1
deftest(x):
print("y",x.y)
x.y = 10s =stack()
s.test()
##看看該句,遮蔽和不遮蔽有何不同
print('
s.y =
',s.y)
#print('stack.y = ',stack.y)
#print('stack().y = ',stack().y)
print(type(stack()))
print(type(s))
print(id(stack))
print(id(stack()))
print(id(s))
如果s.test()被遮蔽程式就會報錯。根據《c++中的this和python的self對比》中講到
如果是已例項呼叫方法,會自動傳入例項的「指標」self,
那麼呼叫s.test() 其實就是 執行了 self.y = 10, 這就構建了乙個例項變數y。
如果不呼叫s.test() ,就相當於沒有構建例項變數y。那邊例項就會去類中找y並將值和類中的y此時的值一致。
//----------------------------分割線-----------
還有乙個問題就是,類屬性和例項屬性的構建時間。
對於python而言,類屬性在類定義之後也構鍵好了,但是在成員定義之後成員屬性並沒有構建!這是為什麼呢?
原因:
因為python不用宣告變數,或者說它的宣告、定義、和初始化是一步到位的。而例項屬性的定義,只能是顯性的通過例項物件來定義(如self.name),
換句話說例項屬性的定義只能在類方法中進行。所以如果該函式沒有被呼叫,那麼方法中的該例項屬性就不會被構建!
所以,如果想在構建例項的時候,就想把例項的屬性都構造好,那麼就必須把例項的屬性的定義放在__init__方法中, 這樣,在構建例項的時候,會自動呼叫__init__方法,這樣就能確保例項屬性被造。
對於c++而言,類屬性在類定義之後就構成好了這和python一樣,而成員屬性,在成員定義之後成員屬性也會構建好(構建的意思就是分配記憶體空間)
至於,方法內定義的變數都是屬於函式的區域性變數,也是只有呼叫函式的時候才會分配空間。還有c++的類定義就只能是定義,成員變數此時是不能初始化的,初始化只能放在建構函式裡等待例項被構造的時候初始化。如果不初始化成員變數的值,就會是定義時分配的記憶體中的值。
還有,c++的類屬性,也就是靜態屬性,他的初始化應該是在定義全域性變數的位置,初始化的方法為:int a::s = 0; (a是類名,s是靜態屬性, 要注意是,此時初始化的過程還必須帶上變數型別!訪問靜態方法也好,訪問靜態屬性也好,都是類名加雙冒號實現!)
//----------------------------分割線-----------
總結:不管是c++還是python都大致分為3種變數/屬性:(叫法我隨便說的,不要在意)
1、類屬性(c++中叫靜態變數,python中叫類屬性)
2、例項屬性(c++中叫成員變數,python中叫成員屬性)
3、區域性變數(c++中叫區域性變數,python中叫區域性變數)
python編譯如何區分這三種變數/屬性?
答:1、宣告在類中,且在方法的外部的屬性就是類屬性。
2、宣告在方法內部,且有例項字首的屬性就是例項屬性
3、宣告在方法內部,且沒有例項字首的屬性就是區域性變數
c++編譯如何區分這三種變數/屬性?
答:1、宣告在類中,且在方法的外部的帶static關鍵字的屬性是類屬性。
2、宣告在類中,且在方法的外部的不帶static關鍵字的屬性是例項屬性。
3、宣告在方法內部,就是區域性變數
python和ruby變數作用域對比
python 1 a 0 2def f 3 a 9 4print a56 f 7 print a 列印出來是9和0 a 0 deff print af print a 列印出來是0和0 python呼叫f函式,執行print a的時候,會先在函式的作用域裡查詢是否有a這個變數,沒有找到再到全域性的作...
python和C語言小對比
因為過年耽誤了幾天和急性蕁麻疹住院了7天,耽誤了很多,住院時沒有電腦,只看書沒有實踐,感覺還是力不從心。在我看來,python的變數不需要事先定義變數型別,但是似乎如果等號右邊不是特定的格式 例如中括號 變數型別預設是字串的,如果要轉成別的型別需要轉換一下。python沒有使用 來分割,而是使用縮排...
python與c 的對比
一位正在學校做課程設計題目,要求在乙個檔案中找到給定單詞出現的位置並統計出現次數。這是乙個比較簡單的文字處理問題,於是,我給他用 python 寫了乙個,並打賭在5分鐘內用不到30行程式解決問題。我作到了,下面是程式 if name main file name raw input input th...