面向对象-基于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

以上均为了便于有对概念直观理解,固然并不严谨。


学习交流,有任何问题还请随时评论指出交流。

相关文章
相关标签/搜索