---
tags: python
---
# 07_類別與物件
## 類別
* 像是模板
* 用於產生同類的物件
* 相關方法可重複使用
* Python慣用Camel case命名類別
### 建立類別
```python
class Animal:
# 用__init__函數設定類別產生物件當下要做的事
# 類別底下的函數第一個參數一定為self
def __init__(self, name, age, category):
self.name = name
self.age = age
self.category = category
# 可建立該類別可用的函數
def intro(self):
print(f'Hi, 我叫{self.name},今年{self.age}歲是一隻{self.category}')
def move(self):
print(f'{self.name}開始跑來跑去')
a1 = Animal('小黑', '3', '狗')
a2 = Animal('加菲', '4', '貓')
a1.intro()
a1.move()
a2.intro()
a2.move()
```
### 建立子類別
* 繼承母類別的所有函數
```python
class Dog(Animal):
def __init__(self, name, age, breed):
Animal.__init__(self, name, age, '狗')
self.breed = breed
def move(self):
print(f'{self.name}開始到處亂跑')
def bark(self):
print('汪!')
a3 = Dog('小白', '5', '馬爾濟斯')
a3.intro()
a3.move()
a3.bark()
```
### 不同物件的互動
```python
class Human:
def __init__(self, name, age):
self.name = name
self.age = age
self.pet = []
# 設定函數傳入一個物件(animal)
def adopt_pet(self, animal):
self.pet.append(animal)
# 將owner屬性設定回animal物件
animal.owner = self.name
# 使用animal的name屬性
print(f'{self.name}收養了{animal.name}')
dog_1 = Dog('小黃', '7', '米克斯')
human_1 = Human('Eric', '28')
human_1.adopt_pet(dog_1)
```
### 模擬銀行帳戶
```python
class BankAccount:
def __init__(self, name, cash):
self.name = name
self.balance = cash
print(f'{self.name}開戶成功')
self.report()
def report(self):
print(f'{self.name} 帳戶餘額: {self.balance}')
def deposit(self, amount):
self.balance += amount
print(f'{self.name}成功存款{amount}')
self.report()
def withdraw(self, amount):
# 如果帳戶餘額不夠提款,提前終止函數
if amount > self.balance:
print(f'{self.name}提款失敗')
# return除了可以回傳值,也可以提前終止函數
return
self.balance -= amount
print(f'{self.name}成功提款{amount}')
self.report()
def transfer(self, account, amount):
if amount > self.balance:
print(f'{self.name}轉帳失敗')
self.report()
return
self.balance -= amount
account.balance += amount
print(f'{self.name}轉了{amount}給{account.name}')
self.report()
account1 = BankAccount('Eric', 5000)
account2 = BankAccount('Ben', 1000)
account1.deposit(10000)
account2.withdraw(500)
account1.transfer(account2, 2000)
```
> Written with [StackEdit](https://stackedit.io/).
<!--stackedit_data:
eyJoaXN0b3J5IjpbLTE4MTIwNzM3OTFdfQ==
-->