Hi there! 我是嘟嘟~受到前輩啟發,想說可以紀錄一下自己練習的過程,小女子為程式超超菜鳥,此系列非教學文,僅為個人解題筆記,可能有錯誤或未補充詳盡之處,歡迎前輩們不吝指教!也歡迎正在自學的夥伴一起討論學習~
第4天難度突變,沒學過class所以花了一些時間,也不確定自己有沒有理解錯誤,歡迎指正補充!
題目要求一個Person
類別(class),整數的屬性參數為initialAge
,指定到實例變數age
,若age
< 0,則將age
設為0然後印出Age is not valid, setting age to 0.
,除此之外還要定義兩個方法(method):
age
by 1 (題目有要求3年後再判斷一次,故讓年齡加1)age
< 13, print You are young.
age
≧ 13 and age
< 18, print You are a teenager.
You are old.
注意: 不要修改到題目原始格式
Note: Do not remove or alter the stub code in the editor.
第一行輸入整數儲存成t
,代表測試值的數量,後面t行輸入整數儲存成age
,作為類別Person
的實例變數。
若age
≧ 0 會印出兩行,若age
< 0 會印出三行
4
-1
10
16
18
Age is not valid, setting age to 0. #因為-1<0,所以要設成0
You are young. #0歲
You are young. #3歲
You are young. #10歲
You are a teenager. #13歲
You are a teenager. #16歲
You are old. #19歲
You are old. #18歲
You are old. #21歲
class Person:
def __init__(self,initialAge):
# Add some more code to run some checks on initialAge
def amIOld(self):
# Do some computations in here and print out the correct statement to the console
def yearPasses(self):
# Increment the age of the person in here
t = int(input())
for i in range(0, t):
age = int(input())
p = Person(age)
p.amIOld()
for j in range(0, 3):
p.yearPasses()
p.amIOld()
print("") #最後這行是系統要判斷是不是和預期輸出一樣,所以不能動到
class Person(): #定義類別Person
def __init__(self, initialAge):
#定義建構子函式__init__,輸入參數self和initialAge
if initialAge < 0:
print('Age is not valid, setting age to 0.')
initialAge = 0 #如果initialAge小於0則將其改為0
self.initialAge = initialAge
#將initialAge指定給變數self.initialAge
def amIOld(self):
#定義函式amIOld,參數為self,印出變數self.initialAge的條件式結果
if self.initialAge < 13:
print('You are young.')
elif 13 <= self.initialAge < 18:
print('You are a teenager.')
else:
print('You are old.')
def yearPasses(self):
#定義函式yearPasses,參數為self,宣告變數self.initialAge = self.initialAge + 1
self.initialAge += 1
t = int(input())
for i in range(0,t):
age = int(input()) #宣告輸入值為變數age
p = Person(age)
#宣告類別為Person的物件p,將變數age作為參數傳回類別Person的函式中
p.amIOld() #呼叫函式amIOld,此時p.initialAge = 原initialAge
for j in range(0,3):
p.yearPasses() ##呼叫函式yearPasses三次
p.amIOld() #此時p.initialAge = 原initialAge + 3
輸入值
2
-5
24
結果為
Age is not valid, setting age to 0.
You are young. #0
You are young. #3
You are old. #30
You are old. #33
基本上只要輸入定義函式的部分就好,下面部分題目本來就給好了(怕太難新手打不出來XD),這題重點就是瞭解 class (類別) ,以下整理了一些資料:
class (類別),就是像一個模組,可以產出具有相似特性(屬性Attribute 及方法Method)的實體(物件Object),也有人會說他像是一個蛋糕模子,可以一直套用生產蛋糕,代表之後的大家都可以取用這個類別的設定,達到避免重複設定函式
類別名稱建議為駝峰式大小寫(CamelCase),字母首字為大寫,單字之間不以空格斷開(例:camel case)或連接號(-,例:camel-case)、底線(_,例:camel_case)連結
每個類別有兩種變數: 類別變數(class variables) 和 實例變數(instance variables)
def __init__(self, <parameters>)
:
這邊代表宣告時會自動執行的函式,也就是宣告類別的"起手式",所以一般會拿來放基礎的屬性設定。(非強制)
類別方法的第一個參數一定是 self
,他是 Python 類別定義中預設的參數,代表建立的物件實體,因此 self.a 與 self.b 都是實體屬性。
存取屬性與執行方法,語法都是利用點號:
<object>.<attribute> # 存取屬性(變數)
<object>.<method>() # 執行方法(函式)
題目的Tutorial有提到 Function overloading (函數重載、函數多載),重載函數是函數的一種特殊情況,為方便使用,允許在同一範圍中聲明幾個功能類似的同名函數,但是這些同名函數的形式參數(指參數的個數、類型或者順序)必須不同,也就是說用同一個函數完成不同的功能。參考文章【為什麼Python不支持函數重載?而其他語言大都支持?】
參考來源:
【Python 程式設計-第 15 章 物件與類別】
【Python類別與例外-高中資訊科技概論教師黃建庭的教學網站】
↑ 嘟嘟覺得他寫得很淺顯易懂又詳細,還有延伸變化(繼承、多型....比較複雜的還沒有理解,未來可以回來看)
【關於Python的類別(Class)...基本篇-張凱喬-Medium】
【Python 入門指南 - 類別】
【Python 入門指南 - init()】
【Python 使用類別】(像教科書但寫得很清楚)
覺得你的比喻不錯呢:
「class (類別)像是一個蛋糕模子,可以一直套用生產蛋糕實體(物件Object)」
對了,小小糾正一點,
你文章說的類別名稱必須為駝峰式大小寫(CamelCase),
那個應該是程式風格建議,不是強制規定(不這樣寫程式還是可以編譯的)
小馬提出一個問題給你思考,可以一起腦力激盪一下,
你覺得用Class有什麼特別的好處嗎?
比如說為什麼不用一個整數代表人的年齡就好?
多一歲就單純寫個函數yearPasses呢?
例如像這樣:
def yearPasses(age):
return age + 1
people_one = 15 #設一個人的年齡15歲
people_one = yearPasses(people_one) #他的年齡多一歲
小馬哥安安!那個比喻是參考資料裡寫的唷XD 我也覺得形容的很貼切呢!
謝謝糾正!!已修改~
用class的好處,在大型程式裡面,使用不同的模組,可以避免掉很多重複的內容(嗎??) 重複宣告類別,套用屬性和函式,直接生成多個物件,像蛋糕模型的概念? 似乎稍微理解,但沒碰過實作,所以還沒辦法體會它的厲害之處>.< 對實例(物件)的概念也不是非常瞭解,想說先有個大概,配合比較有系統的書籍或教學文,回頭複習時會比較清楚XD
再麻煩您提點了!!
謝謝小馬哥用心補充!!