時空背景
物件導向(Object-oriented programming:OOP)理論在1950年初, 就已在人工智慧的著作中出現. 不過實際發展卻是在16年後的1966年.
1966年代, Ram的價格是非常的昂貴. 所以在當時會想出物件導向理論的人, 還真是他媽的神經病. OOP使用大量的記憶空間簡化程式設計並提高撰寫的效能. 這在當時就好比想用螞蟻的腦袋去記取宇宙中的所有資訊, 是一種不切實際的方法, 或者只是滿足一時好奇心的研究. 一切都是空談, 沒有商業價值, 也不可能實現.
8086/80286時期, 電腦剛起步, 舉凡程式設計, 作業系統都未成熟, 且Ram太昂貴, 所以物件導向被視為垃圾. 直到視窗的出現, 才讓世人驚覺物件導向的重要性, 甚至如果沒有物件導向, 也就沒有現在的視窗介面.
Python在設計思維上, 除了重視抽象化的新觀念外, 當然也無法攞脫物件導向的觀念. 所以這是本篇的重點.
物件導向寫法
在未將物件導向納入考慮時, 如果我們要記錄一個學生的姓名及分數, 可以採用dict的方式
s1={"name" : "Thomas", "score" :100} print("%s : %d" % (s1["name"], s1["score"]))
但是當物件導向介入後, 程式寫法改為如下
class Student(object): def __init__(self, name, score): self.name=name self.score=score def getName(self): return self.name def getScore(self): return self.score def setName(self, name): self.name=name s2=Student("Thomas", 100) print("%s : %d " % (s2.getName(), s2.getScore()))
1. 定義類別需使用class 關鍵字, 緊接類別名稱, 然後再一組 “()”. “()”裏面是繼承的類別, 若沒有繼承的類別, 則都是object.也就是說, 所有類別都是繼承object這個頂頭類別.
2. __init__(self, 參數1, 參數2, …..) 稱為建構子, 第一個參數一定是self, 固定不變, 此變數指向實例本身. 建構子只可以return None, 但建議不要寫return.
3. s2=Student(“Thomas”, 100) 產生一個Student物件, 傳入建構子的參數, 不需包含self, 解譯器會自動把此實例的記憶体位址填進去
class是一個抽象的概念, 猶如DNA或設計藍圖. 借此藍圖而產生出 s2 物件的過程, 我們稱為實例化(instance)
如果將s2印出, 則會得到如<__main__.Student object at 0x000002583DB2F048>的訊息, 後面那一大串16進位數字, 即為此物件的記憶体位址. 如果安裝的是64位元的python, 則此位址共有16個數字, 每個數字4bit, 所以總共是64bit