python|一個渣男語言的一輩子


前言python

Python從設計之初就已是一門面向對象的語言,本章節咱們將詳細介紹Python的面向對象編程。編程


【1】面向對象?對象?!

以前說過,用任何編程語言來開發程序都是讓計算機爲咱們幹活,那python怎麼幹活呢?或者說用什麼方法對什麼東西作什麼事呢?app

舉個栗子,咱們要用python:拿菜刀切豆腐(鬼知道怎麼實現?)編程語言

分析一下:方法是用菜刀,東西是豆腐,作的事情就是切豆腐。這三個在python裏面都叫「對象」——沒錯,變態的python(小渣子)爲了告別單身,居然——「萬物皆對象」。兩個數據成員(類變量和實例變量)啦、方法啦通通都是對象!ide

那你說,我用刀切豆腐能夠,切火龍果也行啊,「切」就能夠歸爲一類吧?沒錯,就是這樣子!並且真的叫類(Class)哦!對象就是類的實例啦。既然咱們作事方式(方法)同樣,他們性別(屬性)同樣,那咱們在這些方面就是一類嘛!還能夠生寶寶哦,爸爸類(父類)生baby類(子類),baby類繼承爸爸類的東西,baby類長大後也會成爲爸爸類。並且若是baby類不滿意本身的爸爸,能夠改寫本身(注意:此處沒有隔壁老王)!python中叫方法重寫(若是從父類繼承的方法不能知足子類的需求,能夠對其進行改寫,也叫方法的覆蓋(override))函數

歸類好了,python問你,要我切什麼?你說,切豆腐吧,這就叫作類的實例化(豆腐就是切的東西的實例),告訴python它具體要作什麼。切的東西變來變去,這些變化的東西就叫類變量,類變量一般不做爲實例變量使用、定義在類中且在函數體以外、在整個實例化的對象中是公用的。spa

說了這麼多,其實不論是說切的東西(類變量)和具體要切的火龍果仍是豆腐(實例變量)統稱爲數據成員;「切」這個處理的動做在python中叫作方法,其實就是類中定義的函數。面向對象呢,數據封裝、繼承和多態是它的三大特色,具體就是對函數進行分類和封裝,讓開發「更快更好更強...」.設計

【2】類和實例

面向對象最重要的概念就是類(Class)和實例(Instance),必須牢記類是抽象的模板,好比Food類,而實例是根據類建立出來的一個個具體的「對象」,每一個"對象"都擁有相同的方法,但各自的數據可能不一樣orm

一、尋找對象——建立類

以Food類爲例,在Python中,定義類是經過class關鍵字:對象


Food類實例

class後面緊接着是類名,即Food,類名一般是大寫開頭的單詞緊接着是(object),表示該類是從哪一個類繼承下來的,一般,若是沒有合適的繼承類,就使用object類,這是全部類最終都會繼承的類。而後以冒號結尾。

類的幫助信息能夠經過ClassName.__doc__查看哦!

二、找到對象——建立實例

建立類就是用來用的,那就須要將類實例化。

1)實例化類其餘編程語言中通常用關鍵字 new,可是在 Python 中並無這個關鍵字,類的實例化相似函數調用方式。如下使用類的名稱Food 來實例化,並經過 __init__ 方法接受參數

先來看一個類的實例:


Food類

能夠看到,建立實例是經過類名+()實現的,能夠自由地給一個實例變量綁定屬性,好比,給實例Food綁定name、size等屬性。另外,因爲類能夠起到模板的做用,所以,能夠在建立實例的時候,把一些咱們認爲必須綁定的屬性強制填寫進去。經過定義一個特殊的__init__方法,在建立實例的時候,就把name,score等屬性綁上去。

fooKind 變量是一個類變量,它的值將在這個類的全部實例之間共享。你能夠在內部類或外部類使用 Food.fooKind訪問。

__init__()方法是一種特殊的方法,被稱爲類的構造函數或初始化方法,當建立了這個類的實例時就會調用該方法。( 注意:方法「__init__」先後分別有兩個下劃線!!!)

②self 表明類的實例而非類,self 在定義類的方法時是必須有的,雖然在調用時沒必要傳入相應的參數。類的方法與普通的函數只有一個特別的區別——它們必須有一個額外的第一個參數名稱, 按照慣例它的名稱是 self。有了__init__方法,在建立實例的時候,就不能傳入空的參數了,必須傳入與__init__方法匹配的參數,但self不須要傳,Python解釋器本身會把實例變量傳進去。

③類的私有方法__private_method:兩個下劃線開頭,聲明該方法爲私有方法,不能在類地外部調用。在類的內部調用self.__private_methods

2)有關python那些對象的人設(屬性)

①訪問屬性:使用點(.)。如self.name能夠知道名字

②添加屬性。如:Celery.name=Celery能夠添加一個芹菜的name屬性

③修改屬性。如:Celery.name=Delicious Celery 能夠修改芹菜的name屬性

④刪除屬性。如:del Celery.name

⑤也可使用如下函數的方式來操做:

getattr(obj, name[, default]) : 訪問對象的屬性,返回該屬性的值。

hasattr(obj,name) : 檢查是否存在一個屬性,若是存在該屬性返回 True。

setattr(obj,name,value) : 設置一個屬性。若是屬性不存在,會建立一個新屬性。

delattr(obj, name) : 刪除屬性。

⑥Python內置類屬性

__dict__ : 類的屬性(包含一個字典,由類的數據屬性組成);

__doc__ :類的文檔字符串;

__name__: 類名;

__module__: 類定義所在的模塊(類的全名是'__main__.className',若是類位於一個導入模塊mymod中,那麼className.__module__ 等於 mymod);

__bases__ : 類的全部父類構成元素(包含了一個由全部父類組成的元組)

⑦類的私有屬性__private_attrs:兩個下劃線開頭,聲明該屬性爲私有,不能在類的外部被使用或直接訪問。在類內部的方法中使用時self.__private_attrs

三、分手須知—— 對象銷燬(垃圾回收)

每當python找到一個對象,他就建立一個引用計數,洋洋得意計算本身有幾個對象。當不喜歡人家後, 也就是說, 這個對象的引用計數變爲0 時, 她被python完全遺忘(垃圾回收)。在 Python 內心記錄着全部使用中的對象各有多少魅力(引用)。

析構函數 __del__ ,__del__在對象銷燬的時候被調用,當對象再也不被使用時,__del__方法運行:


劈腿證據


四、結婚生子—— 類的繼承

像某天王同樣,浪蕩多年的python終於安下心來結婚生子,因而出現了爸爸(父類/基類)和baby(子類/派生類).咱們要看看小p會不會像爸爸,就要看他繼承了什麼。這也許就是python積極找對象的緣由之一吧:好處之一就是代碼可重用,畢竟能夠生個孩子繼承本身的優良基因。

1)在python中繼承中的一些特色:

①在繼承中基類的構造(__init__())方法不會被自動調用,它須要在其派生類的構造中調用。

②在調用基類的方法時,須要加上基類的類名前綴且須要帶上self參數變量。區別在於類中調用普通函數時並不須要帶上self參數

③Python老是首先查找對應類型的方法,若是它不能在派生類中找到對應的方法,它纔開始到基類中逐個查找。(先子後父

五、青草盈盈——"多重繼承

若是在繼承元組中列了一個以上的類,那麼它就被稱做"多重繼承" 。 


神奇!一子多父。

六、家庭破裂—— 方法重寫

終於,小p發現了父親的風流韻事,他決心與其斷絕父子關係!重寫本身的人生。


狗血啊


來點正經的


說明

終於,python孤獨終老。

相關文章
相關標籤/搜索