---
tags: python, 程式設計, 物件導向
---
# Class 的用法
在學習程式語言時,或多或少都有聽過物件導向程式設計(Object-oriented programming,簡稱OOP),它是一個具有物件(Object)概念的開發方式,能夠提高軟體的重用性、擴充性及維護性,在開發大型的應用程式時更是被廣為使用,所以在現今多數的程式語言都有此種開發方式,[`Python`](./使用Python.md)當然也不例外。而要使用物件導向程式設計就必須對類別(Class)及物件(Object)等有一些基本的了解。其中`class`通常與[`def`](python_def語句.md)一起出現。
## 主要結構
- 類別(Class)
- 物件(Object)
- 屬性(Attribute)
- 建構式(Constructor)
- 方法(Method)
```python
# 電腦類別
class Computer:
# 建構式
def __init__(self, cpu_name, gpu_name):
self.cpu = cpu_name # cpu屬性
self.gpu = gpu_name # gpu屬性
# 方法(Method)
def dothing(self):
print(f"My computer is {self.cpu} and {self.gpu} .")
```
---
### 類別(Class)
簡單來說,就是物件(Object)的藍圖(blueprint)。就像要生產一部汽車時,都會有設計圖,藉此可以知道此類汽車會有哪些特性及功能,類別(Class)就類似設計圖,會定義未來產生物件(Object)時所擁有的屬性(Attribute)及方法(Method)。
而定義類別的語法如下:
```python
class classname:
statement
```
依照命名方式,一般會讓*每個單字*的字首**大寫**表示,且不得使用底線**_**或是空白分隔單字。
範例如下:
```python
#範例1
class Computer:
def __init__(self, input1, input2):
self.A = input1
#範例2
class MyComputer:
```
---
### 物件(Object)
就是透過類別(Class)實際建立的實體,就像實際生產出來的汽車(例如:Mazda)。類別(Class)與物件(Object)的關係就像汽車設計圖與汽車實體。而建立物件(Object)的語法如下:
```python
object_name = classname()
```
這邊設計一個簡單範例:
```py
class Desktop:
pass
class Notebook:
pass
Macbook = Notebook() # 我們定義Macbook是筆電類別
print(isinstance(Macbook,Desktop))
print(isinstance(Macbook,Notebook))
```
輸出結果
```sh
False
True
```
### 建構式(Constructor)
於建立物件(Object)的同時,會自動執行的方法(Method)。所以通常我們會在建構式(Constructor)中初始化物件(Object)的屬性值(Attribute)。至少要有一個self參數,之後利用逗號區隔其他屬性,語法如下:
```py
class Notebook():
def __init__(self, cpu_name, display_inch):
self.cpu = cpu_name
self.dispalysize = display_inch
```
而這個**self**是什麼意思呢?
它代表了實體物件的參考,也就是目前的物件(**Object**)。這個*self*就是告訴類別(**Class**)目前是在設定哪一個物件的屬性(**Attribute**)。所以範例中的意思就是此物件的`cpu`屬性等於傳入的`cpu_name`屬性值,此物件的`displaysize`屬性等於傳入的`display_inch`屬性值,而傳入屬性值的方式就是在建立物件的時候,如下範例:
---
### 屬性(Attribute)
負責存放物件(Object)的資料。設定物件(Object)的屬性值語法如下:
```py
object_name.attribute_name = value
```
套用前面的範例可以得知
```py
class Notebook():
def __init__(self, cpu_name, display_inch):
self.cpu = cpu_name
self.dispalysize = display_inch
MacbookPro = Notebook('M1',13)
print(MacbookPro.cpu)
print(MacbookPro.dispalysize)
```
執行結果
```sh
M1
13
```
---
### 方法(Method)
可以想像是物件(Object)的行為。定義方法(**Method**)和函式(**Function**)的語法很像,都是def關鍵字開頭,接著自訂名稱,但是方法(Method)和建構式(Constructor)一樣至少要有一個self參數,語法如下:
```py
def method_name(self):
statement
```
簡單來說,任何你希望這個程式做的事情,都可以放在**方法**這個位置,讓物件導向幫你完成想做的事情。
---
## 繼承
繼承(Inheritance)顧名思義,就是會有父類別(或稱基底類別Base Class)及子類別(Sub Class)的階層關係。子類別會擁有父類別公開的屬性(Attribute)及方法(Method)。
所以Python繼承(Inheritance)的概念就是將各類別(Class)會共同使用的屬性(Attribute)或方法(Method)放在一個獨立的類別(Class)中,其它的類別(Class)透過繼承(Inheritance)的方式來擁有,降低程式碼的重複性。
### 一般形式
先來看一段程式碼
```py
class Desktop:
def __init__(self,name,cpu, disk, power):
self.name=name
self.cpu = cpu
self.disk = disk
self.display =display
self.power = power
def start(self):
print("您的電腦已開啟")
class Notebook:
def __init__(self, name,cpu, disk, display, battery):
self.name=name
self.cpu = cpu
self.disk = disk
self.display = display
self.battery = battery
def start(self):
print("您的電腦已開啟")
class Phone:
def __init__(self, name,cpu, disk, display, battery, camera):
self.name=name
self.cpu = cpu
self.disk = disk
self.display = display
self.battery = battery
self.camera = camera
def start(self):
print("您的手機已開啟")
# 指定物件所屬類別
A = Notebook('MacbookPro','M1','256GB',13,'23000mAh')
B = Desktop('iMac','i7 10700','1TB','110V')
C= Phone('iPhone12','A14','256GB',6.1,'2000mAh',3)
# 執行物件方法
A.start()
B.start()
C.start()
```
執行結果
```sh
您的電腦已開啟
您的電腦已開啟
您的手機已開啟
```
---
### 繼承語法
但是,一段程式碼重複部份如此之多,這邊應該針對內容進行精簡化。因此有了**繼承**(inheritance),利用繼承語法將父類別使得相同的方法可以不用在做一次,也使得未來維護程式碼時較為簡單。
範例如下:
```py
class Device:
def __init__(self,name):
self.name=name
def start(self):
print(f'您的{self.name}已經開啟')
class Desktop(Device):
def __init__ (self,name,cpu,disk,power):
self.name=name
self.cpu = cpu
self.disk = disk
self.power=power
def start(self):
super().start() #執行父類別的功能
print('系統已啟動windows 10')
print('------------------------')
class Notebook(Device):
def __init__ (self, name,cpu,disk,display, battery):
self.name=name
self.cpu = cpu
self.disk = disk
self.display = display
self.battery = battery
def start(self):
super().start()
print('系統已啟動macOS Big sur')
print('------------------------')
class Phone(Device):
def __init__ (self, name,cpu,disk,display, battery, camera):
self.name=name
self.cpu = cpu
self.disk = disk
self.display = display
self.battery = battery
self.camera = camera
def start(self):
super().start()
print('系統已啟動ios 14')
print('------------------------')
# 指定物件所屬類別
A = Notebook('MacbookPro','M1','256GB',13,'23000mAh')
B = Desktop('Xeno','i7 10700','1TB','110V')
C= Phone('iPhone12','A14','256GB',6.1,'2000mAh',3)
# 執行物件方法
A.start()
B.start()
C.start()
```
執行結果
```sh
您的MacbookPro已經開啟
系統已啟動macOS Big sur
------------------------
您的Xeno已經開啟
系統已啟動windows 10
------------------------
您的iPhone12已經開啟
系統已啟動ios 14
------------------------
```