# [Python] 淺談物件與類別 ###### tags: `Python` 有在寫程式的人,應該或多或少都聽過所謂的物件導向程式設計(object oriented programming, OOP)。它是一個具有物件(object)概念的開發方式,能夠提高軟體的重用性、擴充性及維護性,在開發大型的應用程式時更是被廣為使用。很多語言都支援此種開發方式,Python當然也不例外。 你可能聽說過,在Python中,什麼東西都是物件。這是什麼意思呢?物件是一種自訂的資料結構,裡面可能包含了各種變數、屬性、函式或方法,一個物件可以透過他的屬性或方法,定義他和別的物件進行互動。 今天我們會學到如何建立類別與物件,並進一步說明類別和物件的關係。 ## 建立類別 我們通常使用類別來建立屬於某個類別的物件。類別,可以想成是一個模板,不同的模板會有不同的屬性,根據不同的屬性,就會建構出不同的物體。在Python中,類別使用`class`來宣告,並且類別的第一個字母按照慣例會使用大寫: ```python= class Employee: def __init__(self): self.working_hour = 0 # attribute def work(self): # method self.working_hour += 1 print("Working:", working_hour) ``` 在上面的類別裡面我們可以看到裡面用`def`關鍵字定義了兩個**方法**(method),其中第一個參數都是`self`,指的就是建立的物件本身: * `__init__`方法是使用這個類別建立物件時的預設方法,稱為initializer,可以不用定義,但如果需要有一些預設的屬性,就可以定義在裡面。在這裡我們初始化了`working_hour`這個屬性(attribute)為0。 * `work`方法是一個普通的方法,在這邊我們讓每次呼叫這個方法的時候都會把`working_hour`這個屬性增加1,並印出目前的`working_hour`值。 方法的定義方式就和一般的函式差不多(差別在於第一個參數必須是`self`),可以設定參數,甚至是給這些參數預設值: ```python= class EmployeeNew: def __init__(self, name, working_hour = 0, salary = 20000): self.name = name self.working_hour = working_hour self.salary = salary def work(self): # method self.working_hour += 1 self.salary += 200 print(self.name, "working:", self.working_hour, "hour(s)") ``` ## 建立物件 想要建立一個物件,只要傳遞適當的引數到initializer就好,方法如下: ```python= alice = EmployeeNew("Alice", salary = 50000) bob = EmployeeNew("Bob", working_hour = 3) eve = EmployeeNew("Eve", working_hour = 8, salary = 70000) ``` 建立新物件之後,我們可以在物件上設定屬性: ```python= alice.salary = 60000 alice.hair = "red" print(f"Alice has {alice.hair} hair, and her salary is {alice.salary}.") ``` 如此一來,執行結果會是: ``` Alice has red hair, and her salary is 60000. ``` 但是,現在這個`hair`屬性只屬於`alice`物件,如果我們想在`eve`ˋ物件上取用這個屬性,會報錯: ```python= print(f"Eve has {eve.hair} hair, and her salary is {eve.salary}.") ``` Python 會給你一個`AttributeError`。這是因為,`hair`屬性是屬於`alice`物件實體的專屬屬性,稱為實體屬性(instance attribute),而`salary`屬性是定義在類別本身裡面的類別屬性(class attribute)。 調用方法的方式和取用屬性的語法類似: ```python= alice.work() ``` 執行結果會是: ``` Alice working: 1 hour ``` ## 範例 [類別與模組化](http://yltang.net/tutorial/python/15/)