1. 程式人生 > >python|一個渣男語言的一生

python|一個渣男語言的一生

color margin break 實例變量 自動調用 需求 寶寶 操作 關鍵字

技術分享圖片

前言

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


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

之前說過,用任何編程語言來開發程序都是讓計算機為我們幹活,那python怎麽幹活呢?或者說用什麽方法對什麽東西做什麽事呢?

舉個栗子,我們要用python:拿菜刀切豆腐(鬼知道怎麽實現?)

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

那你說,我用刀切豆腐可以,切火龍果也行啊,“切”就可以歸為一類吧?沒錯,就是這樣子!而且真的叫類(Class)

哦!對象就是類的實例啦。既然我們做事方式(方法)一樣,他們性別(屬性)一樣,那我們在這些方面就是一類嘛!還可以生寶寶哦,爸爸類(父類)生baby類(子類),baby類繼承爸爸類的東西,baby類長大後也會成為爸爸類。而且如果baby類不滿意自己的爸爸,可以改寫自己(註意:此處沒有隔壁老王)!python中叫方法重寫(如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,也叫方法的覆蓋(override))

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

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

【2】類和實例

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

1、尋找對象——創建類

以Food類為例,在Python中,定義類是通過class關鍵字:

技術分享圖片

Food類實例

class後面緊接著是類名,即Food,類名通常是大寫開頭的單詞緊接著是(object),表示該類是從哪個類繼承下來的,通常,如果沒有合適的繼承類,就使用object類,這是所有類最終都會繼承的類。然後以冒號結尾。

類的幫助信息可以通過ClassName.__doc__查看哦!

2、找到對象——創建實例

創建類就是用來用的,那就需要將類實例化。

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

3、分手須知—— 對象銷毀(垃圾回收)

每當python找到一個對象,他就創建一個引用計數,洋洋得意計算自己有幾個對象。當不喜歡人家後, 也就是說, 這個對象的引用計數變為0 時, 她被python徹底遺忘(垃圾回收)。在 Python 心裏記錄著所有使用中的對象各有多少魅力(引用)。

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

技術分享圖片

劈腿證據


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

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

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

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

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

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

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

如果在繼承元組中列了一個以上的類,那麽它就被稱作"多重繼承" 。

技術分享圖片

神奇!一子多父。

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

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

技術分享圖片

狗血啊

技術分享圖片

來點正經的

技術分享圖片

說明

終於,python孤獨終老。


python|一個渣男語言的一生