当前位置: 首页 > 后端技术 > Python

Python设计模式

时间:2023-03-25 20:16:56 Python

行为模式用于简化类之间的交互。这里提供三个例子:观察者(observer)、访问者(visitor)、模板(template)1.Observer#_*_coding=utf-8_*_classEvent(object):_observers=[]def__init__(self,subject):self.subject=subject@classmethoddefregister(cls,observer):如果观察者不在cls._observers:cls._observers.append(observer)@classmethoddefunregister(cls,observer):如果观察者在cls._observers:cls._observers.remove(observer)@classmethoddefnotify(cls,subject):event=cls(subject)forobserverincls._observers:observer(event)类WriteEvent(Event):def__repr__(self):return'WriteEvent'deflog(event):print'%swaswritten'%event.subjectWriteEvent.register(log)classAnotherObserver(object):def__call__(self,event):print'是的,%s告诉我了!??'%eventWriteEvent.register(AnotherObserver())WriteEvent.notify("给定的文件")2.Visitor#_*_coding=utf-8_*_classvlist(列表):defaccept(self,visitor):visitor.visit_list(self)classvdict(dict):defaccept(self,visitor):visitor.visit_dict(self)classPrinter(object):defvisit_list(self,ob):print'listcintent'printstr(ob)defvisit_dict(self,ob):print'dictkeys:%s'%','.join(ob.keys())#a_list=vlist([1,2,5])#a_list.accept(Printer())#a_dict=vdict({'one':1,'two':2,'three':3})#a_dict.accept(Printer())#defvisit(visitor,visitor):#cls=visited.__class__.__name__#meth='visit_%s'%cls#method=getattr(visitor,meth,None)#ifmethodisnotNone:#method(visited)##访问([1,2,5],Printer())#visit({'one':1,'two':2,'three':3},Printer())importosdefvisit(directory,visitor):forroot,dirs,filesinos.walk(directory):forfileinfiles:ext=os.path.splitext(file)[-1][1:]ifhasattr(visitor,ext):getattr(访问或者,ext)(file)classFileReader(object):defpdf(self,file):print'processing%s'%filewalker=visit("/Users/lucas/Downloads",FileReader())3.模板#_*_coding=utf-8_*_fromitertoolsimportgroupbyclassIndexer(object):defprocess(self,text):text=self._normalize_text(text)words=self._split_text(text)单词=self._remove_stop_words(words)stemmed_words=self._stem_words(words)返回self._frequency(stemmed_words)def_normalize_text(self,text):returntext.lower().strip()def_split_text(self,text):returntext.split()def_remove_stop_words(self,words):raiseNotImplementedErrordef_stem_words(self,words):raiseNotImplementedErrordef_frequency(self,words):counts={}forwordinwords:counts[words]=counts.get(word,0)+1返回countsclassBasicIndexer(Indexer):_stop_words=('他','她','是','and','or')def_remove_stop_words(self,words):return[wordforwordinwordsifwordnotinself._stop_words]def_stem_words(self,words):return[(len(word)>2andword.rstrip('aeiouy')orword)forwordinwords]def_frequency(self,words):freq={}对于wordinwords:freq[word]=freq.get(word,0)+1returnfreqindexer=BasicIndexer()printindexer.process(('我的裁缝很有钱,他也是我的朋友'))