零基礎學Python—類

關於面向物件的語言,Python也是其中一員,儘管它僅僅只是一門解釋性語言,但這並不妨礙它使用類。C語言是一門完完全全的面向過程的語言,但是這並不意味著C語言不能夠實現面嚮物件語言的特性,曾經我就幹過這事,並且為此去修改了一個不開源的編譯器。作為一個用了二十幾年C的老程式設計師,對C語言我有著無與倫比的特殊情感。不僅僅是因為使用的時間長,而是C語言確實是可以達到最高的執行效率,並且有著最好的能效,而C++則有點過於側重開發效率,尤其在C++11上,很多規則都被濫用。當然,某種程度上講促進了硬體的發展,甚至打破了摩爾定律,但是這不是程式本應該有的模樣。有點扯遠了,回過頭來,我們來看Python的類。
對於Python的類,本質上和任何其他的面向物件的語言的類沒有任何的差異。我們如何來理解類呢?我們可以從字面上去理解,我們有一類東西,我們希望給他們歸個類,並且給他們定義一些基本的屬性,這樣我們就可以很容易的通過這個類別來構造一個具體的事物。比如我們定義一個鳥類,那麼我們就可以給它定義一些基本屬性,比如兩條腿、兩隻眼睛等等。這樣我們就能夠不用在定義所有鳥的時候都要去重新設定這些屬性,本質上來說,類是一種程式設計師友好的功能。
面向物件的語言擁有一些基本的屬於,我們現在就先來看看面向物件的一些基本術語和其解釋。
類:簡而言之,類是一個物件原型。這個原型裡實現了一系列的屬性,這些屬性可能是變數,也可能是方法,也可能兼而有之。
類變數:類變數為所有類的例項所共享。類變數定義在類中、類的方法之外。
函式過載:為特定的函式分配多個行為,實際呼叫因物件型別和引數而異。
例項變數:定義在方法之內並且僅屬於當前例項。
繼承:顧名思義,就是繼承父類的屬性。
例項:類的其中一個物件。
例項化:建立物件的過程。
方法:定義在類中的函式。
接下來,我們來配合程式碼來看看類的使用,以及什麼情況下我們需要使用類。類的使用也非常簡單,包括類的建立和類的例項化。我們先來建立一個簡單的類,看看類到底是怎麼一回事。

大家可以看到,其實也很簡單的。在上面的例子中,我們定義了一個類變數empCount,這個變數為所有的例項所共有。然後我們在類的初始化方法裡定義了兩個例項變數name和salary,這兩個變數為當前例項所有。後面大家可以看到這個類裡面還定義了兩個方法,分別用來列印員工總數和員工名字和對應工資。當然,最上面還有一個名為__init__的方法,這個方法也成稱為構造方法,在我們例項化的時候會自動呼叫這個方法。
那麼我們實際使用的時候要怎麼做呢?我們知道,類只是一個原型,只有我們在使用類方法的時候才可以不去例項化,關於這點我們下面會有例子來說明,事實上,我們在後續的文章裡也會讓大家多次看到類方法的例子。一般情況下,我們都是需要去例項化類的。那麼我們來看看怎麼例項化。例項化類之後,大家可以實際去看看類佔多少記憶體。然後在使用結束我們可以用del來釋放記憶體。這主要是給大家一個好的示範,我們在使用類的時候儘量主動去釋放記憶體,而不要讓垃圾回收機制來工作,其實作為一個C程式設計師,我一直反對垃圾回收機制,作為程式設計師,記憶體是應該有程式設計師來管理的。一個優秀的程式設計師能將程式的記憶體使用控制到最優,將效率和記憶體佔用平衡到最佳,這是很多的Java程式設計師一無所知的部分。也正是因為這個原因,我們說,事實上,現在是存在非常嚴重的硬體浪費的。回到正題,我們來看類的例項化。

也很簡單對吧,我們只需要使用類名加一對小括號就能完成類的例項化。那麼例項化到底是一個什麼樣的過程呢?我們可以這樣來理解,我們有一個克隆人本體,這個克隆人本體相當於我們的類,然後我們通過這個克隆人本體來克隆我們的每一個實體的人,我們克隆的人都是由這個本體而來,那麼我們克隆人的這個過程稱之為例項化,克隆出來的人稱為例項。例項化之後,我們就可以呼叫它的方法了。下面我們來看看呼叫類的方法的例子。

大家可以看到我們使用點來訪問類的方法,其實我們除了用點來訪問類的屬性之外還可以用如下四個函式來訪問類的屬性。
getattr(obj, name[, default])
hasattr(obj,name)
setattr(obj,name,value)
delattr(obj, name)
這四個函式見名知意,我們可以來看看它們的用法。

接下來,我們來介紹繼承,繼承其實也很簡單,談到繼承,我們就得談到父類和子類,其實和真實世界的例子是一樣的,比如我們有一動物類,那麼鳥類和熊類都屬於動物類,鳥類和熊類都繼承了動物類的屬性比如有腳有眼睛,但是鳥類只有兩隻腳,而熊類有四條腿。當然我們這裡講的是繼承,我們來看一個例子就明白了。

定義了一個類之後,很容易去定義一個子類。在Python中還有兩個函式可以檢查類和例項、類和子類的關係,分別為:
issubclass(sub, sup)
isinstance(obj, Class)
在Python裡同樣也可以覆蓋父類方法,因為我們有時候會需要將子類行為定義為與父類稍有不同,那麼我們會需要去覆蓋父類的方法,比如我們有一個我們來看一個例子。

我們關於類就聊這麼多,當然還有一些雜七雜八的特性,我們就不聊了。對於初學者來說,只需要理解這些就足夠了,任何一門語言始終是在使用中精通。
人工智慧與深度學習做量化請關注:AI量化(https://t.zsxq.com/RvfY37y) 星球限時免費,如需加入,請私信我獲得免費邀請碼!

零基礎學習Python與深度學習應用請關注星球:Python與深度學習 https://t.zsxq.com/bUFayZ3

微信公眾號:QTechAI
