前言
本文為〈Python 類別與例外〉一文的學習筆記。
特殊函式
Python 會讓運算子與特殊函式自動對應,例如判斷兩物件是否相等的運算子「==
」會自動與類別內特殊函式「__eq__
」對應。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| >>> class Animal(object): def __init__(self, name): self.__name = name def sound(self): pass def show_name(self): return self.__name def __eq__(self, other): return self.__name == other.show_name() >>> class Dog(Animal): def __init__(self, name): super().__init__('小狗' + name) def sound(self): return '汪汪叫' >>> d1 = Dog('小黑') >>> d2 = Dog('小黑') >>> print(d1 == d2) True >>> d3 = Dog('小白') >>> print(d1 == d3) False
|
其他特殊函式與運算子的對應如下:
特殊函式 |
運算子 |
__eq__ (self, other) |
self == other |
__ne__ (self, other) |
self != other |
__gt__ (self, other) |
self > other |
__ge__ (self, other) |
self >= other |
__lt__ (self, other) |
self < other |
__le__ (self, other) |
self <= other |
__add__ (self, other) |
self + other |
__sub__ (self, other) |
self - other |
__mul__ (self, other) |
self * other |
__truediv__ (self, other) |
self / other |
類別方法
類別方法(Class method)作用對象為類別,會影響整個類別,也會影響類別所產生的物件。類別方法的第一個參數通常取名為 cls
,需在類別中函式的前一行使用裝飾器「@classmethod
」。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| >>> class Animal(object): count = 0 def __init__(self): Animal.count += 1 def kill(self): Animal.count -= 1 @classmethod def show_count(cls): print('現在有', cls.count, '隻動物') >>> a = Animal() Animal.show_count() 現在有 1 隻動物 b = Animal() Animal.show_count() 現在有 2 隻動物 c = Animal() Animal.show_count() 現在有 3 隻動物 a.kill() Animal.show_count() 現在有 2 隻動物
|
@classmethod
裝飾器,使得調用方法不需要先實例化。
靜態方法
靜態方法(Static method)讓類別不需要建立物件,就可以直接使用該類別的靜態方法,需在類別中函式的前一行使用裝飾器「@staticmethod
」。
1 2 3 4 5
| >>> class Say(object): @staticmethod def hello(): print('Hello') >>> Say.hello()
|
例外
在執行程式的過程中產生錯誤,程式會中斷執行,發出例外訊息。
1 2 3 4
| >>> try: pwd = input('請輸入密碼') except: print('發生錯誤')
|
自訂例外。
1 2 3 4 5 6 7 8 9 10 11 12 13
| >>> class PwdException(Exception): def __init__(self,pwd,len): super().__init__(self) self.pwd = pwd self.len = len try: pwd = input('請輸入密碼,長度至少8個字元') if len(pwd) < 8: raise PwdException(pwd,len(pwd)) except PwdException as pex: print('密碼長度不足') else: print('輸入密碼為', pwd)
|