# 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}]"}
    330 views