靜態方法,類方法,屬性,setter用法,delete用法和屬性方法的應用場景
一、靜態方法
1.1、定義
在類中的方法前面通過@staticmethod裝飾器即可把其裝飾的方法變為一個靜態方法
1 2 3 4 5 6 7 8 9 10 |
@staticmethod
|
1.2、靜態方法的特性
靜態方法是不能訪問例項變數和類變數的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
object ):
% self .name)
|
事實上以上程式碼執行會出錯的,說speak 需要一個self引數,但呼叫時卻沒有傳遞,沒錯,當speak變成靜態方法後,再通過例項呼叫時就不會自動把例項本身當作一個引數傳給self了。
1 2 3 4 |
|
想讓以上程式碼可以正常執行,有兩種方法:
- 在呼叫時將例項本身傳給 speak()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
2.在方法speak中去掉self,但這也意味著,在eat中不能通過self.呼叫例項中的其它變量了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1.3 總結
普通的方法,可以在例項化後直接呼叫,並且在方法裡可以通過self.呼叫例項變數或類變數,但靜態方法是不可以訪問例項變數或類變數的,一個不能訪問例項變數和類變數的方法,其實相當於跟類本身已經沒什麼關係了,它與類唯一的關聯就是需要通過類名來呼叫這個方法。
二、類方法
2.1、定義
類方法通過@classmethod裝飾器實現,類方法和普通方法的區別是, 類方法只能訪問類變數,不能訪問例項變數
2.2、訪問例項變數
直接訪問例項變數會報錯,沒有該屬性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
2.3、訪問類變數,即 全域性屬性/靜態欄位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
三、屬性方法
3.1、定義
屬性方法的作用就是通過@property把一個方法變成一個靜態屬性
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 |
|
1 |
|
呼叫會出錯誤, 說NoneType is not callable, 因為eat此時已經變成一個靜態屬性了, 不是方法了, 想呼叫已經不需要加()號了,直接p.drive就可以了
正常呼叫:
1 2 3 4 5 6 |
|
3.2 setter用法
如果我們想在屬性方法裡傳參,比如車的品牌,我們就要用setter了,具體用法 @屬性方法名.setter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
很顯然我們開出去的車就是蘭博基尼,如果我們想自己傳入車品牌呢?比如 特斯拉:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
3.3 deleter 用法
用來刪除屬性方法,具體用法 @屬性方法名.deleter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
但是我們用del p.drive這種方法來刪除屬性方法是行不通的:
1 2 3 4 5 6 7 |
|
所以我們就要用到 deleter方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
讓我們在秋名山再開一次車...
1 2 3 4 5 6 7 8 9 10 11 12 |
|
四、屬性方法應用場景
你想知道一個航班當前的狀態,是到達了、延遲了、取消了、還是已經飛走了, 想知道這種狀態你必須經歷以下幾步:
1. 連線航空公司API查詢
2. 對查詢結果進行解析
3. 返回結果給你的使用者
因此這個status屬性的值是一系列動作後才得到的結果,所以你每次呼叫時,其實它都要經過一系列的動作才返回你結果,但這些動作過程不需要使用者關心,使用者只要知道結果就行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
|