最近同事聊起所謂面向對象,這裏使用Python實現一個搜索引擎的小功能,來做爲對面向對象的理解。相關概念網上不少,這裏再也不多複述,先從代碼走起,再代入概念。python
代碼功能:根目錄下有1.txt 2.txt 3.txt 三個文件,實現輸入文件名,返回是否有該文件及該文件的文件大小模塊化
代碼要實現的功能很簡單,這裏引用類的寫法是爲了做爲解釋面向對象的例子,簡單功能能夠無需這樣寫,如如果工程開發,這樣寫的好處在於經過面向對象的設計,定義好了各功能接口,模塊化開發,實現高內聚低耦合。函數
#SearchEngineBase定義好了各功能接口,經過繼承便可對功能進行使用或者再開發 class SearchEngineBase(): def __init__(self): pass def add_corpus(self, file_name, file_size): self.process_corpus(file_name, file_size) def process_corpus(self, id, file_size): raise Exception('process_corpus not implemented') def search(self,query): raise Exception('search not implemented') #該函數是爲了後續調用類使用 def main(search_engine): for file_name in os.listdir(os.getcwd()): file_size = str(os.path.getsize(os.getcwd() + '\\' + file_name)) + ' byte' search_engine.add_corpus(file_name, file_size) while True: query = input() results = search_engine.search(query) if len(results) > 0: print('file in path.file size are:',results[query]) else: print('file not in path.') #繼承父類,得到功能接口 class SimpleEngine(SearchEngineBase): def __init__(self): super(SimpleEngine,self).__init__() self._id_to_texts={} def process_corpus(self, id, file_size): self._id_to_texts[id] = file_size def search(self,query): results = {} for k,v in self._id_to_texts.items(): if query in k: results[k] = v return results search_engine = SimpleEngine() main(search_engine) #########輸出########## 1.txt file in path.file size are: 193 byte 100.txt file not in path.
- 面向對象幾個特徵:學習
1.繼承:理解爲子類繼承父類的特徵和行爲,如代碼例子SimpleEngine(SearchEngineBase)實現對父類SearchEngineBase的繼承,所以可使用父類中add_corpus,哪怕本身沒有定義,也能夠經過繼承來使用。搜索引擎
2.多態:理解爲容許相同或不一樣子類型的對象對同一消息做出不一樣響應,如代碼例子SimpleEngine在對父類繼承後,對process_corpus及search進行了功能重寫,也就是繼承了可是也能夠作不一樣功能的實現。設計
3.封裝:理解爲把數據和操做數據綁定,對外界只暴露接口,如search_engine = SimpleEngine(),就實現了對SimpleEngine類的調用,至於裏面如何實現不須要知道,使用函數main(search_engine)便可運行code
4.抽象:特徵總結後構造類的過程,造成對應的類/屬性/方法/對象等,粗略理解能夠說整個class就是抽象後的結果。模塊化開發
- 幾個概念概念大體的對應理解:對象
類:類似事物的集合,如例子class定義繼承
屬性:對象的某個靜態特徵,例子file_size表明對象(對應文件)的文件大小
方法/函數:對象的某個動態能力,例子使用def定義
對象:集合中的一個事物,這裏對應由 class 生成的某一個 object,如例子中的 search_engine
以上均爲了便於有對概念直觀理解,固然並不嚴謹。
學習交流,有任何問題還請隨時評論指出交流。