認識 Python 物件導向(二)

前言

本文為〈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() # count + 1
Animal.show_count() # 直接調用方法
現在有 1 隻動物
b = Animal() # count + 1
Animal.show_count() # 直接調用方法
現在有 2 隻動物
c = Animal() # count + 1
Animal.show_count() # 直接調用方法
現在有 3 隻動物
a.kill() # count - 1
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)