---
# System prepended metadata

title: '[Python] 淺談物件與類別'
tags: [Python]

---

# [Python] 淺談物件與類別
###### tags: `Python`

有在寫程式的人，應該或多或少都聽過所謂的物件導向程式設計（object oriented programming, OOP）。它是一個具有物件（object）概念的開發方式，能夠提高軟體的重用性、擴充性及維護性，在開發大型的應用程式時更是被廣為使用。很多語言都支援此種開發方式，Python當然也不例外。

你可能聽說過，在Python中，什麼東西都是物件。這是什麼意思呢？物件是一種自訂的資料結構，裡面可能包含了各種變數、屬性、函式或方法，一個物件可以透過他的屬性或方法，定義他和別的物件進行互動。

今天我們會學到如何建立類別與物件，並進一步說明類別和物件的關係。

## 建立類別
我們通常使用類別來建立屬於某個類別的物件。類別，可以想成是一個模板，不同的模板會有不同的屬性，根據不同的屬性，就會建構出不同的物體。在Python中，類別使用`class`來宣告，並且類別的第一個字母按照慣例會使用大寫：
```python=
class Employee:
    def __init__(self):
        self.working_hour = 0 # attribute

    def work(self): # method
        self.working_hour += 1
        print("Working:", working_hour)
```
在上面的類別裡面我們可以看到裡面用`def`關鍵字定義了兩個**方法**（method），其中第一個參數都是`self`，指的就是建立的物件本身：
* `__init__`方法是使用這個類別建立物件時的預設方法，稱為initializer，可以不用定義，但如果需要有一些預設的屬性，就可以定義在裡面。在這裡我們初始化了`working_hour`這個屬性（attribute）為0。
* `work`方法是一個普通的方法，在這邊我們讓每次呼叫這個方法的時候都會把`working_hour`這個屬性增加1，並印出目前的`working_hour`值。

方法的定義方式就和一般的函式差不多（差別在於第一個參數必須是`self`），可以設定參數，甚至是給這些參數預設值：
```python=
class EmployeeNew:
    def __init__(self, name, working_hour = 0, salary = 20000):
        self.name = name
        self.working_hour = working_hour 
        self.salary = salary

    def work(self): # method
        self.working_hour += 1
        self.salary += 200
        print(self.name, "working:", self.working_hour, "hour(s)")
```

## 建立物件
想要建立一個物件，只要傳遞適當的引數到initializer就好，方法如下：
```python=
alice = EmployeeNew("Alice", salary = 50000)
bob = EmployeeNew("Bob", working_hour = 3)
eve = EmployeeNew("Eve", working_hour = 8, salary = 70000)
```
建立新物件之後，我們可以在物件上設定屬性：
```python=
alice.salary = 60000
alice.hair = "red"
print(f"Alice has {alice.hair} hair, and her salary is {alice.salary}.")
```
如此一來，執行結果會是：
```
Alice has red hair, and her salary is 60000.
```
但是，現在這個`hair`屬性只屬於`alice`物件，如果我們想在`eve`ˋ物件上取用這個屬性，會報錯：
```python=
print(f"Eve has {eve.hair} hair, and her salary is {eve.salary}.")
```
Python 會給你一個`AttributeError`。這是因為，`hair`屬性是屬於`alice`物件實體的專屬屬性，稱為實體屬性（instance attribute），而`salary`屬性是定義在類別本身裡面的類別屬性（class attribute）。

調用方法的方式和取用屬性的語法類似：
```python=
alice.work()
```
執行結果會是：
```
Alice working: 1 hour
```

## 範例
[類別與模組化](http://yltang.net/tutorial/python/15/)