python的類 物件導向程式設計

2022-01-19 11:28:09 字數 2305 閱讀 7990

摘自謬雪峰

物件導向程式設計的乙個重要特點就是資料封裝,在上面的student類中,每個例項就擁有各自的namescore這些資料。我們可以通過函式來訪問這些資料,比如列印乙個學生的成績:

>>> def print_score(std):

... print('%s: %s' % (std.name, std.score))

...>>> print_score(bart)

bart simpson: 59

但是,既然student例項本身就擁有這些資料,要訪問這些資料,就沒有必要從外面的函式去訪問,可以直接在student類的內部定義訪問資料的函式,這樣,就把「資料」給封裝起來了。這些封裝資料的函式是和student類本身是關聯起來的,我們稱之為類的方法:

class student(object):

def __init__(self, name, score):

self.name = name

self.score = score

def print_score(self):

print('%s: %s' % (self.name, self.score))

這樣一來,我們從外部看student類,就只需要知道,建立例項需要給出name和score,而如何列印,都是在student類的內部定義的,這些資料和邏輯被「封裝」起來了,呼叫很容易,但卻不用知道內部實現的細節。

類是建立例項的模板,而例項則是乙個乙個具體的物件,各個例項擁有的資料都互相獨立,互不影響;

方法就是與例項繫結的函式,和普通函式不同,方法可以直接訪問例項的資料;

通過在例項上呼叫方法,我們就直接操作了物件內部的資料,但無需知道方法內部的實現細節。

兩個下劃線開頭的變數是私有變數,再外部不能直接訪問,但是,有些時候,你會看到以乙個下劃線開頭的例項變數名,比如_name,這樣的例項變數外部是可以訪問的,但是,按照約定俗成的規定,當你看到這樣的變數時,意思就是,「雖然我可以被訪問,但是,請把我視為私有變數,不要隨意訪問」。

雙下劃線開頭的例項變數是不是一定不能從外部訪問呢?其實也不是。不能直接訪問__name是因為python直譯器對外把__name變數改成了_student__name,所以,仍然可以通過_student__name來訪問__name變數:

>>> bart._student__name

'bart simpson'

但是強烈建議你不要這麼幹,因為不同版本的python直譯器可能會把__name改成不同的變數名。

總的來說就是,python本身沒有任何機制阻止你幹壞事,一切全靠自覺。

要理解什麼是多型,我們首先要對資料型別再作一點說明。當我們定義乙個class的時候,我們實際上就定義了一種資料型別。我們定義的資料型別和python自帶的資料型別,比如str、list、dict沒什麼兩樣:

a = list() # a是list型別

b = animal() # b是animal型別

c = dog() # c是dog型別

判斷乙個變數是否是某個型別可以用isinstance()判斷:

>>> isinstance(a, list)

true

>>> isinstance(b, animal)

true

>>> isinstance(c, dog)

true

多型的好處就是,當我們需要傳入dog、cat、tortoise……時,我們只需要接收animal型別就可以了,因為dog、cat、tortoise……都是animal型別,然後,按照animal型別進行操作即可。由於animal型別有run()方法,因此,傳入的任意型別,只要是animal類或者子類,就會自動呼叫實際型別的run()方法,這就是多型的意思:

對於乙個變數,我們只需要知道它是animal型別,無需確切地知道它的子型別,就可以放心地呼叫run()方法,而具體呼叫的run()方法是作用在animal、dog、cat還是tortoise物件上,由執行時該物件的確切型別決定,這就是多型真正的威力:呼叫方只管呼叫,不管細節,而當我們新增一種animal的子類時,只要確保run()方法編寫正確,不用管原來的**是如何呼叫的。這就是著名的「開閉」原則:

對擴充套件開放:允許新增animal子類;

對修改封閉:不需要修改依賴animal型別的run_twice()等函式。

python物件導向程式設計類與物件的用法

class student object 類屬性 num 0 def init self,name,score 初始化方法 self.name name 雙下滑線定義私有屬性,私有屬性只能在類裡面被訪問 外面無法直接訪問私有屬性 self.score score self.class 自動返回每個物...

python程式設計 12 類的定義 物件導向

類 某種型別集合的描述。舉例 人 屬性 類本身的一些特性,如名字 身高和體重等屬性 屬性具體值則會根據每個人的不同而不同 方法 類所能實現的行為,如吃飯 走路和睡覺等方法。類的定義 class classname 父類名 成員函式及成員變數 init 建構函式 初始化物件的各屬性 del 析構函式 ...

Python 物件導向程式設計 內建類方法

說明 init self,初始化物件,在建立新物件時呼叫 del self 釋放物件,在物件被刪除之前呼叫 new cls,args,kwd 例項的生成操作 str self 在使用print語句時被呼叫 getitem self,key 獲取序列的索引key對應的值,等價於seq key len ...