# Class
2021 資訊之芽python班
---
## 來記錄一下一些資訊
----
```python=
player_name = 'MuscleManShaoChun'
player_strength = 100000000
player_item = ["chicken breast", 'salad']
```
<span>沒什麼問題,那就再加一個<!-- .element: class="fragment" data-fragment-index="1" --></span>
----
```python=
player1_name = 'MuscleManShaoChun'
player1_strength = 100000000
player1_item = ["chicken breast", 'salad']
player2_name = 'Rick_Astley'
player2_strength = 20091025
player2_item = ["never", 'gonna', 'give', 'you', 'up']
```
<span>沒什麼問題,那就再加一個<!-- .element: class="fragment" data-fragment-index="1" --></span>
----
```python=
player1_name = 'MuscleManShaoChun'
player1_strength = 100000000
player1_item = ["chicken breast", 'salad']
player2_name = 'Rick_Astley'
player2_strength = 20091025
player2_item = ["never", 'gonna', 'give', 'you', 'up']
player3_name = 'NoName'
player3_strength = 47
player3_item = ["NameChangeCard", 'cheatsheet']
```
<span>越來越多,有點麻煩...<!-- .element: class="fragment" data-fragment-index="1" --></span>
---
## 化簡的方法
----
### 學過的:dictionary
```python=
player1 = {'name':'MuscleManShaoChun',
'strength': 100000000,
'item': ["chicken breast", 'salad']}
```
----
### 新的酷東西: Class!
---
## Class
----
### Class 是啥
- 中文:類別
- 基本上是自己創造一個物件(資料型態)
- 把函數跟變數結合的工具
- 模板
- 可以用來建tree, heap之類的資料結構
----
### Class 怎麼定義
```python=
class Player:
pass
```
----
### Class 怎麼用
跟函數定義的方式很像
```python=
class Player:
pass
player1 = Player()
player1.name = "MuscleManShaoChun"
player1.strength = 100000000
player1.item = ["chicken breast", 'salad']
player2 = Player()
player2.name = 'Rick_Astley'
player2.strength = 20091025
player2.item = ["never", 'gonna', 'give', 'you', 'up']
```
這似乎沒有比較簡單
----
### Class 裡面也可以放函數,變數或class
```python=
class Player:
def set_variables(name, strength, items):
Player.name = name
Player.strength = strength
Player.items = items
def change_name(new_name):
Player.name = new_name
player1 = Player()
player1.set_variables("MuscleManShaoChun", 100000000, ["chicken breast", 'salad'])
player2 = Player()
player2.set_variables('Rick_Astley', 20091025, ["never", 'gonna', 'give', 'you', 'up'])
```
<span>哈哈笑死是不是出bug了<!-- .element: class="fragment" data-fragment-index="1" --></span>
<span>
```python=
TypeError: set_variables() takes 3 positional arguments but 4 were given
```
<!-- .element: class="fragment" data-fragment-index="2" --></span>
----
### 酷酷的新名詞
- method(方法): class裡面的function
- instance(實體): 依照class做出來的物件
- attribute(屬性): class裡面的變數
----
### \_\_init__, self
#### self
- class裡面的method至少要有self
- 決定要設定哪一個物件
#### \_\_init__
- 特殊的method
- 是一個constructor,初始化的時候用
- `obj = classname()`
- 一定要有self
----
### 正確的寫法
```python=
class Player:
def __init__(self, name, strength, items):
self.name = name
self.strength = strength
self.items = items
def change_name(self, new_name):
self.name = new_name
player1 = Player("MuscleManShaoChun", 100000000, ["chicken breast", 'salad'])
player2 = Player('Rick_Astley', 20091025, ["never", 'gonna', 'give', 'you', 'up'])
player1.change_name('SuperMuscleManShaoChun')
```
---
### class attribute vs instance attribute
----
```python=
class phone:
password = '0000'
a = phone()
b = phone()
c = phone()
print(phone.password, a.password, b.password, c.password)
```
<span>`'0000', '0000', '0000', '0000'`<!-- .element: class="fragment" data-fragment-index="1" --></span>
----
```python=
a.password = '1234'
print(phone.password, a.password, b.password, c.password)
```
<span>`'0000', '1234', '0000', '0000'`<!-- .element: class="fragment" data-fragment-index="1" --></span>
----
```python=
phone.password = '5678'
print(phone.password, a.password, b.password, c.password)
```
<span>`'5678', '1234', '5678', '5678'`<!-- .element: class="fragment" data-fragment-index="1" --></span>
<span>`為什麼a沒有跟著改`<!-- .element: class="fragment" data-fragment-index="2" --></span>
----
用`vars()`看attribute
```python=
vars(a) #{'password':'1234'}
vars(b) #{}
vars(c) #{}
vars(phone) #{..., 'password':'5678'}
```
----
```python=
phone.color = 'black'
print(phone.color, a.color, b.color, c.color)
```
<span>`'black', 'black', 'black', 'black'`<!-- .element: class="fragment" data-fragment-index="1" --></span>
----
```python=
a.price = 10000
print(phone.price, a.price, b.price, c.price)
```
<span>`AttributeError`<!-- .element: class="fragment" data-fragment-index="1" --></span>
---
## 練習時間
----
利用之前的Player, 寫一個函數`a.transfer_items(b)`把b的items全部轉移到a, 並平分他們的strength
----
### 範例解
```python=
class Player:
def __init__(self, name, strength, items):
self.name = name
self.strength = strength
self.items = items
def transfer_items(self, b):
self.items.extend(b.items)
self.strength = b.strength = (self.strength+b.strength)/2
```
---
## 延伸
- [有趣的東西](https://youtu.be/dQw4w9WgXcQ)
- [淺談python類別](https://www.learncodewithmike.com/2020/01/python-class.html)
- attribute
- property
- inheritance
{"metaMigratedAt":"2023-06-15T23:48:15.852Z","metaMigratedFrom":"Content","title":"Class","breaks":true,"contributors":"[{\"id\":\"54bbdba3-ffbf-423a-b026-751cb8a77149\",\"add\":5958,\"del\":867}]"}