python|一個渣男語言的一生
前言
Python從設計之初就已經是一門面向對象的語言,本章節我們將詳細介紹Python的面向對象編程。
【1】面向對象?對象?!
之前說過,用任何編程語言來開發程序都是讓計算機為我們幹活,那python怎麽幹活呢?或者說用什麽方法對什麽東西做什麽事呢?
舉個栗子,我們要用python:拿菜刀切豆腐(鬼知道怎麽實現?)
分析一下:方法是用菜刀,東西是豆腐,做的事情就是切豆腐。這三個在python裏面都叫“對象”——沒錯,變態的python(小渣子)為了告別單身,竟然——“萬物皆對象”。兩個數據成員(類變量和實例變量)啦、方法啦統統都是對象!
那你說,我用刀切豆腐可以,切火龍果也行啊,“切”就可以歸為一類吧?沒錯,就是這樣子!而且真的叫類(Class)
歸類好了,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|一個渣男語言的一生