靜态方法
靜态方法是一種普通函數,就位于類定義的命名空間中,它不會對任何執行個體類型進行操作。使用裝飾器@staticmethod定義靜态方法。類對象和執行個體都可以調用靜态方法;
說了那麼多,估計會有些懵逼,咱們還是直接上代碼看下靜态方法怎麼使用吧!
1.按照正常邏輯編寫代碼并加上@staticmethod定義靜态方法eat:
1 2 3 4 5 6 7 8 9 10 | |
運作上面代碼,我們會發現報以下錯誤:
TypeError: eat() missing 1 required positional argument: 'self'
----------eat需要一個self參數,但調用時卻沒有傳遞
so...我們可以得出一個結論:eat變成靜态方法後,再通過執行個體調用時不會自動把執行個體本身當作一個參數傳給self
2.解決辦法:
1)調用時主動傳遞執行個體本身給eat方法,即d.eat(d)
1 2 3 4 5 6 7 8 9 10 11 | |
2)在eat方法中去掉self參數(這也意味着,在eat中不能通過self.調用執行個體中的其它變量了)
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
類方法
類方法是将類本身作為對象進行操作的方法。類方法使用@classmethod裝飾器定義,其第一個參數是類,約定寫為cls。類對象和執行個體都可以調用類方法。
類方法和普通方法的差別是, 類方法隻能通路類變量,不能通路執行個體變量。
依然還是原來的代碼,把eat變為類方法看下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
報錯說明:People沒有name屬性;
上面說過,類方法隻能通路類變量,不能通路執行個體變量,而name在這裡就是執行個體變量。
我們加上一個類變量試試:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
屬性方法
屬性方法的作用就是通過@property把一個方法變成一個靜态屬性;
依然還是之前的代碼,把eat方法變成靜态屬性看下效果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
這裡報錯是因為eat已經變成了一個靜态方法,當然不能再使用()去調用了,我們直接調用試試:
1 2 3 4 | |
反射
1.反射的定義
根據字元串的形式去某個對象中操作成員
- 根據字元串的形式去一個對象中尋找成員
- 根據字元串的形式去一個對象中設定成員
- 根據字元串的形式去一個對象中删除成員
- 根據字元串的形式去一個對象中判斷成員是否存在
2. 反射的函數
- getattr(object, name[, default])
根據字元串的形式去一個對象中尋找成員
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
- setattr(object, name, value)
根據字元串的形式去一個對象中設定成員
1 2 3 4 5 6 7 8 9 10 11 12 | |
- delattr(object, name)
根據字元串的形式去一個對象中删除成員
1 2 3 4 5 6 7 8 9 10 11 12 | |
- hasattr(object, name)
根據字元串的形式去一個對象中判斷成員是否存在
1 2 3 4 5 6 7 8 9 10 11 12 | |
異常處理
在之前學習的過程中我們會接觸到各式各樣的報錯資訊,程式設計過程中為了增加友好性,可以抓取相對應的錯誤并給出提示資訊。
常用異常:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
更多異常:
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 47 48 | |
常用異常執行個體:
IndexError(輸出指定錯誤資訊并列印錯誤資訊)
1 2 3 4 5 6 7 8 9 | |
KeyError(輸出指定錯誤資訊并列印錯誤資訊)
1 2 3 4 5 6 7 8 9 10 | |
ValueError
1 2 3 4 5 6 7 8 9 | |
萬能異常Exception:(不建議用,不便于調試;可與異常配合使用)
1 2 3 4 5 6 7 8 9 | |
自定義異常:
1 2 3 4 5 6 7 8 9 | |
轉載于:https://www.cnblogs.com/liuyuchen123456/p/5855894.html