一、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:
結果: |