面向對象基礎語法

 

一、dir內置函數

二、定義簡單的類

三、方法中的self參數

四、初始化方法

五、內置方法和屬性

 

一、dir內置函數

首先推薦一個Python的內置函數:dir()。

在Python中,對象無所不在。我們之前學習的變量、數據、函數都是對象。比如a = 10。a就是變量(引用);10就是數據。

 

 

我們前面在IPython中,通過下面的方式查看一個對象都有哪些方法:

 

 

但是,這種方式不是萬能的,不能看函數或者數據都哪些方法或屬性。

比如下面這個列表,按下tab鍵之後就沒有反應。

 

再比如,定義了下面的函數。按下tab鍵同樣沒有反應。

 

本節我們學習dir()函數,通過傳入變量名/函數名/數據,可以查看該對象所有的屬性和方法。

 

例:

 

 

結果:

 

結果輸出了一個很大的列表,裏面有很多以"_ _"開頭,以"_ _"結尾的方法或屬性。這些都是針對這個對象,提供的內置方法或屬性。這些裏面有的可以直接使用,比如__doc__屬性

 

 

 

二、定義一個簡單的類

1. 類名採用大駝峯

2. 類中定義的方法,第一個參數必須是self

 

例1:test.py

 

結果:

 

注意:在面向對象開發中,引用的概念是同樣適用的。當輸出變量時,可以看到是由哪個類創建的,對象的地址是多少。

 

 

 

結果:

 

 

例2:

 

判斷tom和cat1是同一只貓麼?

cat1和cat2是同一只貓麼?

 

結果:

 

tom和cat1不是同一只貓。cat1和cat2是同一只貓。

 

 

 

三、類方法中的self參數

1. 在Python中,如果不想修改類,想直接給類的對象增加屬性。可以使用 對象名.屬性 = 值的方式實現【例1】。雖然簡單,但是不推薦這麼做。太簡單粗暴了,容易出錯【例3】。類的屬性也應該封裝在類的內部。

2. 由哪一個對象調用的方法,方法內的self 就是哪一個對象的引用。【例2】

 

 

 

例1:編寫代碼,加入斷點

 

 

結果:

 

可以看到執行到12行時,tom對象中有了name這個屬性。

 

 

例2:

 

結果:

 

我們在13行加入斷點。

 

可以發現 tom變量引用了A470這個對象。即:tom是A470這個對象的引用。

step in之後:

 

可以看到self跟tom一樣,也是指向同一個對象。都是這個對象的引用。

這就說明了:由哪個對象調用的方法,類方法中的self就是這個對象的引用。

 

 

 

例3:

 

結果:

 

出錯了。就是因爲執行到11行的時候,name屬性還沒有定義,eat()方法找不到。所以不要在類外部定義屬性。

 

 

四、初始化方法

使用類名()可以創建一個對象,比如 Cat()。創建對象的時候,Python解釋器會自動做一下操作:

1. 在內存中分配一塊空間。

2. 調用初始化方法__init__。【例1】

 

我們現在關注的就是第二件事情:初始化方法。

初始化方法的作用就是專門來定義一個類具有哪些屬性的。【例2】

 

 

 

例1:創建對象的時候,會自動調用初始化方法。

 

結果:

 

並沒有調用初始化方法,在創建對象時,會自動調用。

 

例2:在初始化方法中定義參數

 

結果:

 

 

五、內置方法

接下來再介紹兩個對象的內置方法。

1. __del__

我們知道,使用類名創建對象時,會自動調用__init__方法。可以在初始化方法中定義對象的屬性。

在Python中,還有一個跟初始化方法相對應的方法:__del__。當一個對象要銷燬前,會自動調用__del__方法。

 

在開發中,如果希望一個對象離開世界之前,希望讓他做一些事情,就可以用這個方法。【例1】【例2】

 

 

例1:

 

 

結果:

 

因爲tom是一個全局變量。當所有代碼執行完後纔會銷燬。

 

例2:可以使用del關鍵字刪掉對象

 

結果:

 

 

 

2. __str__

默認情況下,在使用print(對象) 時,輸出的是這個對象是由哪個類創建的,並且對象的內存地址是什麼。

如果不想輸出上面的信息,而是我們自定義的信息。就可以使用__str__方法。需要注意,這個方法一定要返回一個字符串。【例1】

 

例1:

 

結果: