最近同事聊起所谓面向对象,这里使用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)即可运行
4.抽象:特征总结后构造类的过程,形成对应的类/属性/方法/对象等,粗略理解可以说整个class就是抽象后的结果。
- 几个概念概念大致的对应理解:
类:相似事物的集合,如例子class定义
属性:对象的某个静态特征,例子file_size代表对象(对应文件)的文件大小
方法/函数:对象的某个动态能力,例子使用def定义
对象:集合中的一个事物,这里对应由 class 生成的某一个 object,如例子中的 search_engine
以上均为了便于有对概念直观理解,当然并不严谨。
学习交流,有任何问题还请随时评论指出交流。