物件導向的概念有三大特性分別為:
接下來我們會依序介紹這三種特性
封裝的用意是要讓物件裡的資料隱藏起來,其他物件只能透過物件本身提供的介面存取裡面的資料,取得裡面的屬性(attribute)或方法(method),也就是說,朕不給的,你不能要(誤
,正確一點的說法是,我們只需要知道這個物件的外在就好,不需要知道物件是如何取得資料
讓我們來看一個例子:
首先,我們先定義一個人的類別叫做Person,這個人的類別有許多抽象的特性可以描述,例如名字、性別、身高、體重、生日等等等,下面可以看到程式碼如何定義一個類別
class Person:
def __init__(self, name, gender, height, weight, birthday):
self.name
self.gender
self.height
self.weight
self.birthday
p1 = Person("Peter", "male", 180.0, 70.0, "1987/8/7")
p2 = Person("Linda", "female", 160.0, 45.0, "1978/7/8")
上面的程式碼我們做了許多動作,一一解釋給大家
私有變數
再來我們替這個類別新增一些方法(method)並對某些屬性進行封裝,譬如我們想要得到這個人的BMI值,而且不想讓其他物件知道這個人的身高和體重,我們可以在變數前面加兩個下底線"__variable"這樣可以將變數變成私有變數,即只有物件內部才能夠取得資料,無法從外部物件取得
class Person:
def __init__(self, name, gender, height, weight, birthday):
self.name = name
self.gender = gender
self.__height = height
self.__weight = weight
self.birthday = birthday
def get_BMI(self):
return (self.__weight/ ((self.__height/100)**2))
p1 = Person("Peter", "male", 180.0, 70.0, "1987/8/7")
p2 = Person("Linda", "female", 160.0, 45.0, "1978/7/8")
當我們想要取得p1這個人的BMI值時,只要呼叫物件的get_BMI()
函數,如下
p1.get_BMI()
但當我們想要取得p1這個人的身高體重時,因為__height
為私有變數,則會出現錯誤
>>> p2.__height
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Person' object has no attribute '__height'