最近同事聊起所谓面向对象,这里使用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
以上均为了便于有对概念直观理解,固然并不严谨。
学习交流,有任何问题还请随时评论指出交流。