面向對象-基於Python代碼例子簡談

最近同事聊起所謂面向對象,這裏使用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

以上均爲了便於有對概念直觀理解,固然並不嚴謹。


學習交流,有任何問題還請隨時評論指出交流。

相關文章
相關標籤/搜索