對於一個學C++的朋友來說,Python類中,哪些是私有成員,哪些是共有成員,估計一直傻傻分不清。
一、本篇博客要解決的問題:
Python類中,哪些是私有成員?哪些是共有成員?
二、 關於Python的類
要想了解Python的類,就必須認識到,當你在Python中寫了一個類的時候,你就已經構建了一個新的類型。
所以,你寫的類型其本身有屬性和方法,而類型對應的實例,也有自己的屬性,不過並沒有方法。
也就是說,Python中的類,實際上有兩層含義,第一層是類本身,第二層是實例。
類型本身有屬性和方法,類的屬性可以在所有實例中傳遞,類的方法用來處理實例的數據。
實例本身只有屬性,沒有方法,屬性就是要被類的方法所處理的數據。
Python通過class語句定義一個類,通過__init__(self, *para)構造一個實例,並通過__del__(self)來解構。class是類,self是實例。
三、解決問題。
了解了上面所說的類和實例之后,你可能就已經明白了。Python中類的屬性其實就是共有變量,我們稱之為類的變量,類的變量可以在所有實例中間傳遞。而實例的屬性則可以大致看成是私有變量,但其實這並不是嚴格意義上的私有變量,因為我們依然可以通過instance.property來訪問並修改這些屬性。綜上所述:Python中,類的成員,有兩種。
1、類成員。可以通過Class.property來調用,也可以通過instance.property來調用,該屬性可以在所有實例中傳遞
2、實例的成員。只能通過instance.property來調用,該屬性不與其他實例共享。
3、注意,類的self相當於C++中的指針,但是也有所不同,因為self只指示該實例的數據,不指示類的屬性和方法。所以當你需要在類的方法中調用類的屬性或者類的其他方法的時候,你需要用類名或者self來指明。但是用類名和用self來指明時,結果是不一樣的。詳情請見四中的實例代碼。
四、示例代碼

# -*- coding: utf-8 -*- # author: zxr # time: 2019-04-10 # functionality: test class class TestClass: val = 0 def __init__(self, v): self.val1 = v def show(self): print ('-'*60) print (self.val1) def add_using_classname(self): self.val1 += TestClass.val TestClass.show(self) # below code is unvalid # self.val1 += val # show() def add_using_self(self): self.val1 += self.val self.show() if __name__ == '__main__': tc = TestClass(1) tp = TestClass(10) print (TestClass.val) print (tc.val) print (tc.val1) print (TestClass.val) print (tp.val) print (tp.val1) print ('-'*60) TestClass.val = 2 print ('-'*60) print (TestClass.val) print (tc.val) print (tc.val1) print (TestClass.val) print (tp.val) print (tp.val1) print ('-'*60) tp.val1 = 3 tc.val1 = 4 tp.val = 30 tc.val = 40 print ('-'*60) print (TestClass.val) print (tp.val) print (tc.val) print (tp.val1) print (tc.val1) tc.add_using_classname() tp.add_using_classname() tc.add_using_self() tp.add_using_self()
總結:Python中的類與C++中的類是不一樣的。Python中的每實例化一個實例之后,就拷貝了一個該類的副本,對這個實例的任何修改都不會影響到類。同樣的,要想修改類中的屬性,也只能在類中修改,在實例中的修改影響不了其他實例。