認識 Python 物件導向(一)

前言

本文為〈Python 類別與例外〉一文的學習筆記。

建立類別

假想一個 Animal 類別:

1
2
3
4
5
6
7
>>> class Animal(object):
color = 'white' # 類別屬性
def __init__(self, name): # 建構子
self.name = name # 將參數指定給類別變數
>>> a = Animal('動物')
>>> a.name
'動物'
  • __init__() 函式,表示宣告類別時會自動執行的函式,即建構子。第一個參數 self 是必須的,表示當前類別。

繼承類別

假想一個 Dog 類別,繼承原有的 Animal 類別。

1
2
3
4
5
6
>>> class Dog(Animal):
def __init__(self, name):
super().__init__('小狗' + name)
>>> d = Dog('小白')
>>> d.name
'小狗小白'
  • super() 函式用來調用父類別函式。

覆寫類別

在子類別使用相同函式覆寫父類別 sound() 函式。

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> class Animal(object):
def __init__(self, name):
self.name = name
def sound(self):
pass
>>> class Dog(Animal):
def __init__(self, name):
super().__init__('小狗' + name)
def sound(self):
return '汪汪叫'
>>> d = Dog('小白')
>>> d.sound()
'汪汪叫'

多型

多個類別可以定義相同的函式名稱。

以下範例 Dog 類別和 Bird 類別都有 who() 函式。

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
>>> class Animal(object):
def __init__(self, name):
self.name = name
def who(self):
return self.name
def sound(self):
pass
>>> class Dog(Animal):
def __init__(self, name):
super().__init__('小狗' + name)
def sound(self):
return '汪汪叫'
>>> class Bird():
def __init__(self, name):
self.name = '小鳥' + name
def who(self):
return self.name
def sound(self):
return '啾啾叫'
>>> def talk(obj):
print(obj.who(), '正在', obj.sound())
>>> d = Dog('小白')
talk(d)
小狗小白 正在 汪汪叫
>>> b = Bird('小黃')
talk(b)
小鳥小黃 正在 啾啾叫

定義可視性

在 Python 的類別裡,所有的方法都預設為 Public。

在變數或函式名稱前,加上雙底線「__」,可使其無法被繼承、無法被外部訪問。

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> class Animal(object):
def __init__(self, name):
self.__name = name
def show_name(self):
return self.__name
>>> class Dog(Animal):
def __init__(self, name):
super().__init__('小狗' + name)
>>> d = Dog('小白')
>>> d.show_name()
'小狗小白'
>>> d.__name
AttributeError