面向對象編程基礎
類和對象
- 簡單的說,類是對象的藍圖和模板,而對象是類的實例。
- 這個解釋雖然有點像用概念在解釋概念,但是從這句話我們至少可以看出,類是抽象的概念,而對象是具體的東西。
- 在面向對象編程的世界中,一切皆爲對象,對象都有屬性和行爲,每個對象都是獨一無二的,而且對象一定屬於某個類(型)。
- 當我們把一大堆擁有共同特徵的對象的**靜態特徵(屬性)和動態特徵(行爲)**都抽取出來後,就可以定義出一個叫做“類”的東西。
定義類
在Python中可以使用class
關鍵字定義類,然後在類中通過之前學習過的函數來定義方法
class Student(object):
# __init__是一個特殊方法用於在創建對象時進行初始化操作
# 通過這個方法我們可以爲學生對象綁定name和age兩個屬性
def __init__(self, name, age):
self.name = name
self.age = age
def study(self, course_name):
print('%s正在學習%s.' % (self.name, course_name))
# PEP 8要求標識符的名字用全小寫多個單詞用下劃線連接
# 但是很多程序員和公司更傾向於使用駝峯命名法(駝峯標識)
寫在類中的函數,我們通常稱之爲(對象的)方法,這些方法就是對象可以接收的消息。
創建和使用對象
def main():
# 創建學生對象並指定姓名和年齡
stu1 = Student('駱昊', 38)
# 給對象發study消息
stu1.study('Python程序設計')
stu2 = Student('王大錘', 15)
stu2.study('思想品德')
if __name__ == '__main__':
main()
訪問可見性
- 在很多面向對象編程語言中,我們通常會將對象的屬性設置爲私有的(private)或受保護的(protected),簡單的說就是不允許外界訪問
- 而對象的方法通常都是公開的(public),因爲公開的方法就是對象能夠接受的消息。
- Python中,屬性和方法的訪問權限只有兩種,也就是公開的和私有的,如果希望屬性是私有的,在給屬性命名時可以用兩個下劃線作爲開頭
class Test:
def __init__(self, foo):
self.__foo = foo
def __bar(self):
print(self.__foo)
print('__bar')
def main():
test = Test('hello')
# AttributeError: 'Test' object has no attribute '__bar'
test.__bar()
# AttributeError: 'Test' object has no attribute '__foo'
print(test.__foo)
if __name__ == "__main__":
main()
- 在實際開發中,我們並不建議將屬性設置爲私有的,因爲這會導致子類無法訪問(後面會講到)。
- 所以大多數Python程序員會遵循一種命名慣例就是讓屬性名以單下劃線開頭來表示屬性是受保護的,本類之外的代碼在訪問這樣的屬性時應該要保持慎重。
- 這種做法並不是語法上的規則,單下劃線開頭的屬性和方法外界仍然是可以訪問的,所以更多的時候它是一種暗示或隱喻
面向對象的支柱
面向對象有三大支柱:封裝、繼承和多態。
- 封裝:隱藏一切可以隱藏的實現細節,只向外界暴露(提供)簡單的編程接口
- 我們在類中定義的方法其實就是把數據和對數據的操作封裝起來了,在我們創建了對象之後,只需要給對象發送一個消息(調用方法)就可以執行方法中的代碼
- 也就是說我們只需要知道方法的名字和傳入的參數(方法的外部視圖),而不需要知道方法內部的實現細節(方法的內部視圖)。