零基礎學習 Python 之初識「類」

寫在以前

若是你是第一次據說「類」 這個概念,把它單獨的做爲一個名詞你可能會以爲怪怪的,總以爲前面缺乏了修飾成分。其實,「類」是由 class 翻譯過來的,它對應的英文單詞是 class編程

基本概念

不論學什麼,概念都是很是重要的,想要學得某學科的語言,就必須使用相應的概念。在學「類」的時候,咱們除了「類」還要知道什麼是 OOP,即「面向對象編程」。因此咱們先來認識幾個 「術語」,這些術語跟現實生活中的某些名字可能相像,可是表明的不一樣的含義。bash

1.問題空間編程語言

知道什麼是「問題空間」 是一個搬磚的必備基礎,咱們下面來看一下《維基百科》中關於它的定義:函數

問題空間是問題解決者對一個問題所達到的所有認識狀態,它是由問題解決者利用問題所包含的信息和已儲存的信息主動構成的。ui

一個問題通常由三個方面來定義:初始狀態(開始時的不徹底的信息),目標狀態(你但願得到的信息或狀態),操做(從初始狀態到目標狀態所採起的步驟)。這三個部分加在一塊兒定義了問題空間。spa

2.對象翻譯

這裏的「對象」不是你的「對象」,英文單詞是 Object,至於爲何翻譯成對象咱們不去追究,咱們須要知道的是「Python 中的一切都是對象」,無論你是字符串,函數仍是類,都是對象。設計

那你可能問了,Python 都是對象有什麼用麼?簡直是太有用了,這說明 Python 是面向對象編程的!code

大佬們對於對象的定義至關高深:「一個對象要有本身的狀態,行爲和惟一的標識;全部相同類型的對象所具備的結構和行爲在它們共同的類中被定義」。大佬們的話確實有水平,可是這個定義對於初學者來講可能不太好理解。cdn

其實簡言之,對象應該具備屬性(就是大佬們說的狀態),方法(就是大佬們說的行爲)和標識,可是標識是自動就完成的,因此咱們通常不用管它,因此一個對象主要就是有屬性和方法,屬性是說這個東西是什麼,方法是說這個東西能作什麼。

3.面向對象

面向對象(OOP),是如今編程的主流。面向對象編程能夠看做是一種在程序中包含各類獨立且又互相調用的對象的思想,這個和傳統正好相反,傳統的思想主張將程序直接看做是一系列對計算機下達的指令,而面向對象編程中的每個對象都應該可以接受數據,處理數據而且能將數據傳達給其它對象,所以它們每個均可以看做是一個小型的機器,即「對象」。

目前來講面向對象編程推廣了程序的靈活性和可維護性,而且在大型項目設計中廣爲應用。當咱們提到面向對象的時候,它不只僅是指一種程序設計方法,更多意義上是一種程序開發方式。

4.類

在目前所流行的高級編程語言中,「類」 是必需要有的,咱們先來看《維基百科》中的定義:

在面向對象編程中,類 (class) 是一種面向對象計算機編程語言的構造,是建立對象的藍圖,描述了所建立的對象共同的屬性和方法。

對於類更嚴格點的定義是由某種特定的元數據所組成的內聚的包。它描述了一些對象的行爲規則,而這些對象就被成爲該類的實例。類有接口和結構,接口描述瞭如何經過方法與類及其實例互相操做,而結構描述了一個實例中數據如何劃分爲多個屬性。

支持類的編程語言在支持與類相關的各類特性方面都多多少少有一些微妙的差別。大多數都支持不一樣形式的類繼承。類的出現,爲面向對象編程的三個最重要的特性(封裝,繼承,多態)提供了實現的手段。

看到這裏,你或許有這麼一個認識,要面向對象編程就要用到類,雖然不是很嚴格,可是咱們能夠這麼說,固然了,反過來的話是不能夠的。

寫 「類」

類是對某一羣具備一樣屬性和方法的對象的抽象,好比長翅膀會飛的的生物,咱們把它們統一稱爲「鳥」。

這裏咱們以「漂亮小姐姐」爲例,咱們要定義類,就要抽象的找出共同的方面,咱們用 class 來聲明,而後後面跟着類的名字:

class 小姐姐:
                 pass
複製代碼

咱們在這裏先不用 Python 來寫,而是用不太像僞代碼的方式來表示,主要是爲了讓你們先了解一下什麼是什麼:

class 小姐姐:
   皮膚 = 白色
   髮色 = 黑色
   唱歌()
   跳舞()
複製代碼

咱們定義了一個叫小姐姐的類,後面沒有帶括號的是屬性,帶括號的是方法,其中的屬性和方法,默認是因此的小姐姐都具備,這個類僅僅是對小姐姐們的一般抽象,並非指某個具體的誰誰誰。

對於一個具體的小姐姐,好比西施,她就是上面定義的小姐姐這個類的具體化,這在編程中稱爲「小姐姐」類的實例:

西施 = 小姐姐()
複製代碼

用上面的方式就是將「小姐姐」 類實例化了,所謂的實例,就是一個具體的東西。對於西施這個實例,就能夠具體化一些屬性,好比髮色,還能夠用一些具體的方法,好比唱歌,一般用「.」的方式,好比 西施.皮膚,就獲得白色。

下面開始咱們不用僞代碼了,開始用真正的 Python 代碼來了解類。

Python 是個不斷髮展的語言,因而有了 Python2 和 Python3 兩個版本,在 Python2 中,類分爲「新式類」和「舊式類」,可是在 Python3 中沒有這種新舊之分,就只是 「類」而已,固然咱們的用的版本仍是 Python3。

建立一個 「類」

如何建立一個「類」,爲了更廣泛性的說明,我來寫一個具備一般類的結構的類,請看下面的例子:

class Person:
   """ 具備一般類的結構的 Person 類 """
   def __init__(self,name):
       self.name = name

   def get_name(self):
       return self.name

   def get_sex(self,sex):
       per_sex = {}
       per_sex[self.name] = sex
       return per_sex
複製代碼

上面的 Person 類是一個很常見的類,下面我來對它就行逐一解釋:

在 Python3 中全部的類都是 object 的子類,正是由於這個緣由,因此不用像 Python2 中那樣要把對 object 的繼承寫出來。

class Person:這是在聲明建立一個名字是「Person」的類,關鍵詞是 class,就和函數的 def 同樣。類的名字按照慣例通常用大寫字母開頭,若是名字是兩個單詞,那麼兩個單詞的首字母都要大寫,好比 HotDog,固然了若是你不想這樣也是能夠的,可是我但願你記住 「你的代碼是給別人看的」,不要給別人和本身之後讀代碼的時候帶來麻煩。最後當全部的一切都結束的時候,別忘了在最後帶上冒號。

接下來就是類裏面的代碼塊,上面例子中類裏的代碼塊看起來很熟悉,都是 def 這個關鍵詞開頭的函數。你是對的,它們就是函數,可是你仔細看一下就會發現,這些函數跟咱們在前面學過的函數略微不一樣,它們的參數都有「self」(要注意 self 是默認的第一個參數)。這個正是類中函數的特點,是爲了跟咱們之前學過的函數區別開來,因此通常在類裏的函數咱們不叫它們函數,而叫它們 「方法」。因此當你聽到有人說「方法」 的時候,不用奇怪,它和函數在本質上是同樣的。

下面對類裏的幾個函數作一個簡要的介紹。

def __init__(self,name):這是一個特殊的方法,以雙下劃線開頭和結尾,這樣的方法其實在類裏面還有不少,統一叫它們「特殊方法」。對於 __init__() 還有一個別的名字,叫「構造函數」,也有叫它是「初始化方法」 的,我的認爲第二個更好一點,由於單從字面上來看,它對應的含義應該是初始化。所謂的初始化,就是讓類有一個基本的樣子,而不是裏面什麼也沒有,不少事情都要初始化,讓事情有一個具體的起點狀態,好比你要吃飯,碗裏得先有飯。在用類建立實例的時候,首先執行的是初始化方法。

在上面的例子中,初始化方法裏的參數除了 self 之外,還有一個 name,在 Person 類被實例化的同時,要傳給它一個值。self.name = name 的意思是創建實例的一個屬性,這個屬性的名字也是 name,它的值等於參數 name 所傳入的值。要注意的是,這裏的屬性 self.name 和參數 name 是純屬巧合,你也能夠寫成 self.aaa = name,只不過這樣寫會以爲很彆扭。

接下來的 def get_name(self)def get_sex(self,sex) 是類裏面的另外兩個方法,這兩個方法除了第一個參數必須是 self 之外,其它跟函數沒有什麼區別。你只須要注意的是,兩個方法中都用到了 self.name,屬性的這種調用方式只能在類裏面使用。

「類」 的實例

類是對象的定義,實例纔是真實的東西。好比「人」是一個類,可是「人」 終究不是具體的某個會喘氣的,只有「rocky」纔是具體的東西,但他是具備「人」 這個類所定義的屬性和方法。「rocky」就是「人」這個類的實例。

咱們繼續用上面那個類的例子,直接寫一下調用這個類的代碼:

if __name__ == "__main__":
   boy = Person('rocky')
   print(boy.name)
   name = boy.get_name()
   print(name)
   his_sex = boy.get_sex('男')
   print(his_sex)
複製代碼

上面代碼中 girl = Person('rocky') 是利用上面的類建立的實例。建立實例的過程就是調用類 Person(),首先執行的是初始化函數,上述例子中的初始化函數有兩個參數,即 self 和 name,其中 self 是默認參數,不須要傳值,name 則須要給它傳值,因此用Person('rocky') 的樣式。

boy 就是一個實例,它有屬性和方法,self.name 是它的屬性,boy.get_name()boy.get_sex('男') 是經過實例來調用方法。

剛纔是以 boy = Person('rocky') 的方式建立了一個實例,仿照這個樣式還能夠創建更多的實例,好比 girl = Person('xishi') 等,也就是說,一個類能夠建立多個實例。

寫在最後

這就是經過類建立實例,而且經過實例來調用屬性和方法的過程,我感受我已經說的很詳細了,但願你能認真的看完。

更多內容,歡迎關注公衆號「Python空間」,期待和你的交流。

在這裏插入圖片描述
相關文章
相關標籤/搜索