python裡面也引入了物件導向的方法,除了一些C++的基本概念,還有其他一些不同,例如python的類有時候可以作為一個命名空間
1 class MyData(object):2 pass
python的繼承文法是class class_name(parent_class_name),所以上面的MyData對象繼承與object對象,至於object對象,則是python的內建對象,暫且不談
上面的就是聲明了一個空類,但是和C++不同的是,這個類本身可以當作一個命名空間使用,例如:
1 mathObj = MyData()2 mathObj.x = 43 mathObj.y = 54 mathObj.x + mathObj.y
這個時候mathObj更多隻是作為一個命名空間使用
當我們需要定義一個成員函數的時候:
1 class MyData(object):2 def printFoo(self):3 print "you invoked printFoo()"4 def printFoo2():5 print "you invoked printFoo2()"
printFoo2的定義是錯誤的,調用成員函數printFoo2的時候,解譯器會報錯,因為他定義形參self,self就是C++裡面的this,不過C++在我們定義成員函數的時候,會自動幫我們產生,不用像python這樣手動產生(還是我不知道??),我們調用一個成員函數,python和C++也都會自動幫我們傳遞類對象,所以當我們調用printFoo2的時候,解譯器幫我們傳遞self對象,但是printFoo2並沒有定義這個形參
當然,python裡面的類也有建構函式和解構函式,與C++不同的是,python的建構函式是__init__,解構函式是__del__
1 class MyData(object):2 def __init__(self):3 print "init"4 def __del__(self):5 print "del"
1 obj = MyData()2 init3 obj = 24 del
當我們建立obj的時候,會調用__init__函數,當把obj指向其他的資料的時候,python啟動記憶體回收機制,Mydata對象被刪除了,同時也調用了__del__函數
python還有一個比較注意的,就是建立類的時候會有一個同名的執行個體,例如我們有如下的類:
1 class C(object):2 foo = 100
如果我們輸入print C.foo,那麼解譯器會輸出100,如果我們輸入C.foo = C.foo+1,那麼C.foo會變成101,這時候如果我們b = C(),那麼print b.foo會發現輸出的是101,這是因為foo在這裡實際上是一個靜態變數,類似於C++在類裡面定義了一個static int foo
但是如果我們的C裡面定義了一個function,我們調用C.function()會怎麼樣,會報錯,這點跟foo不同,這個是因為function還沒有和一個類去綁定
在C++裡面如果我們需要拿到一個類的資訊,可以利用typeof,而python裡面也有類似的功能,不過需要類繼承自object
有如下的:
__name__:類名
__doc__:類的文檔
__bases__:所有父類構成的元組
__dict__:類的屬性
__module__:類所在的模組
__class__:對應的類