面向對象編程——Object Oriented Programming,簡稱OOP琢歇,是一種程序設計思想拣挪。OOP把對象作為程序的基本單元克蚂,一個對象包含了數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)。
面向過程的程序設計把計算機程序視為一系列的命令集合瞻赶,即一組函數(shù)的順序執(zhí)行赛糟。為了簡化程序設計,面向過程把函數(shù)繼續(xù)切分為子函數(shù)砸逊,即把大塊函數(shù)通過切割成小塊函數(shù)來降低系統(tǒng)的復雜度璧南。
而面向對象的程序設計把計算機程序視為一組對象的集合,而每個對象都可以接收其他對象發(fā)過來的消息师逸,并處理這些消息司倚,計算機程序的執(zhí)行就是一系列消息在各個對象之間傳遞。
在Python中篓像,所有數(shù)據(jù)類型都可以視為對象动知,當然也可以自定義對象。自定義的對象數(shù)據(jù)類型就是面向對象中的類(Class)的概念员辩。
我們以一個例子來說明面向過程和面向對象在程序流程上的不同之處盒粮。
假設我們要處理學生的成績表,為了表示一個學生的成績奠滑,面向過程的程序可以用一個dict表示:
std1 = { 'name': 'Michael', 'score': 98 }
std2 = { 'name': 'Bob', 'score': 81 }
而處理學生成績可以通過函數(shù)實現(xiàn)丹皱,比如打印學生的成績:
def print_score(std):
print('%s: %s' % (std['name'], std['score']))
如果采用面向對象的程序設計思想,我們首選思考的不是程序的執(zhí)行流程养叛,而是Student這種數(shù)據(jù)類型應該被視為一個對象种呐,這個對象擁有name和score這兩個屬性(Property)。如果要打印一個學生的成績弃甥,首先必須創(chuàng)建出這個學生對應的對象爽室,然后,給對象發(fā)一個print_score消息,讓對象自己把自己的數(shù)據(jù)打印出來阔墩。
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print('%s: %s' % (self.name, self.score))
給對象發(fā)消息實際上就是調用對象對應的關聯(lián)函數(shù)嘿架,我們稱之為對象的方法(Method)。面向對象的程序寫出來就像這樣:
bart = Student('Bart Simpson', 59)
lisa = Student('Lisa Simpson', 87)
bart.print_score()
lisa.print_score()
面向對象的設計思想是從自然界中來的啸箫,因為在自然界中耸彪,類(Class)和實例(Instance)的概念是很自然的。Class是一種抽象概念忘苛,比如我們定義的Class——Student蝉娜,是指學生這個概念,而實例(Instance)則是一個個具體的Student扎唾,比如召川,Bart Simpson和Lisa Simpson是兩個具體的Student。
所以胸遇,面向對象的設計思想是抽象出Class荧呐,根據(jù)Class創(chuàng)建Instance。
面向對象的抽象程度又比函數(shù)要高纸镊,因為一個Class既包含數(shù)據(jù)倍阐,又包含操作數(shù)據(jù)的方法。