面向?qū)ο缶幊獭狾bject Oriented Programming,簡稱OOP茫经,是一種程序設(shè)計(jì)思想巷波。OOP把對象作為程序的基本單元,一個對象包含了數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)卸伞。
面向過程的程序設(shè)計(jì)把計(jì)算機(jī)程序視為一系列的命令集合抹镊,即一組函數(shù)的順序執(zhí)行,為了簡化程序設(shè)計(jì)瞪慧,面向過程把函數(shù)繼續(xù)切分成子函數(shù)髓考,即把大塊函數(shù)通過切割成小塊函數(shù)來降低系統(tǒng)的復(fù)雜度。
而面向?qū)ο蟮某绦蛟O(shè)計(jì)把計(jì)算機(jī)程序視為一組對象的集合弃酌,而每個對象都可以接收其他對象發(fā)過來的信息氨菇,并處理這些信息,計(jì)算機(jī)程序的執(zhí)行就是一系列消息在各個對象之間傳遞妓湘。在Python中查蓉,所有數(shù)據(jù)類型都可以視為對象,當(dāng)然也可以自定義對象榜贴。自定義的對象數(shù)據(jù)類型就是面向?qū)ο笾械念惖母拍睢?br>
我們以一個例子來說明面向過程和面向?qū)ο笤诔绦蛄鞒躺系牟煌幫阊小<僭O(shè)我們要處理學(xué)生的成績表,為了表示一個學(xué)生的成績唬党,面向過程的程序可以用一個dict表示:
std1 = {'name' : 'Cris', 'score' : 98}
std2 = {'name' : 'John', 'score' : 93}
而處理學(xué)生成績可以通過函數(shù)實(shí)現(xiàn)鹃共,比如打印學(xué)生的成績:
>>> def print_score(std):
... print("%s : %s" % (std['name'], std['score']))
如果采用面向?qū)ο蟮某绦蛟O(shè)計(jì)思想,我們首選思考的不是程序的執(zhí)行流程驶拱,而是Student
這種數(shù)據(jù)類型應(yīng)該被視為一個對象霜浴,這個對象擁有name
和score
兩個屬性。如果要打印一個學(xué)生的成績蓝纲,首先必須創(chuàng)建出來這個學(xué)生對應(yī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ā)消息實(shí)際上就是調(diào)用對象對應(yīng)的關(guān)聯(lián)函數(shù)锹漱,我們稱之為對象的方法(Method)。面向?qū)ο蟮某绦驅(qū)懗鰜砭拖襁@樣:
>>> bart = Student('Bart Simpson', 59)
>>> lisa = Student('Lisa Simpson', 87)
>>> bart.print_score()
Bart Simpson : 59
>>> lisa.print_score()
Lisa Simpson : 87
面向?qū)ο蟮脑O(shè)計(jì)思想是從自然界中來的慕嚷,因?yàn)樵谧匀唤缰懈珉梗悾–lass)和實(shí)例(Instance)的概念是很自然的。Class是一種抽象概念喝检,比如我們定義的Class——Student砂心,是指學(xué)生這個概念,而實(shí)例(Instance)則是一個個具體的Student蛇耀,比如,Bart Simpson和Lisa Simpson是兩個具體的Student坎弯。
所以纺涤,面向?qū)ο蟮脑O(shè)計(jì)思想是抽象出Class,根據(jù)Class創(chuàng)建Instance抠忘。
面向?qū)ο蟮某橄蟪潭扔直群瘮?shù)要高撩炊,因?yàn)橐粋€Class既包含數(shù)據(jù),又包含操作數(shù)據(jù)的方法崎脉。