以简洁、明确的样式将方法和属性委托给子对象
superdelegate的Python项目详细描述
超级代表
以简洁、明确的方式将方法和属性委托给子对象
考虑一下排序列表的激励示例。为了封装列表并防止客户机破坏排序顺序,我们只允许某些方法通过底层列表: 大部分代码都是重复的。我们能做得更好吗?对!有超级代表! 对属性有效吗?它对属性有效! 可以有多个delgate吗?你可以! 这个库的灵感来自ruby activesupport的importbisectclassSortedList:def__init__(self,*args,**kwargs):self._lst=list(*args,**kwargs)definsert(self,elem):bisect.insort(self._lst,elem)def__contains__(self,elem):ix=bisect.bisect(self._lst,elem)returnix!=len(self._lst)andself._lst[ix]==elemdef__getitem__(self,key):returnself._lst.__getitem__(key)def__reversed__(self):returnself._lst.__reversed__()def__len__(self):returnself._lst.__len__()def__iter__(self):returnself._lst.__iter__()
importbisectfromsuperdelegateimportSuperDelegate,delegate_toclassSortedList(SuperDelegate):def__init__(self,*args,**kwargs):self._lst=list(*args,**kwargs)definsert(self,elem):bisect.insort(self._lst,elem)def__contains__(self,elem):ix=bisect.bisect(self._lst,elem)returnix!=len(self._lst)andself._lst[ix]==elem__getitem__=__reversed__=__len__=__iter__=delegate_to('_lst')
常见问题
classOnlyGrowsOlder:def__init__(self):self._age@propertydefage(self):returnself._age@age.setterdefage(self,new_age):ifnew_age>self._age:self._age=new_ageelse:raiseValueError('Time is like a boy band. It only flows in one direction')classOlderWrapper(SuperDelegate):def__init__(self):self._agerage=delegate_to('_ager')
classSandwichMaker:defchoose_cheese(self):return'swiss'classNavyEngineer:deflift_periscope(self):return'done'classSubmarineTechnician(SuperDelegate):def__init__(self):self.sm=SandwichMaker()self.ne=NavyEngineer()choose_cheese=delegate_to('sm')lift_periscope=delegate_to('ne')
灵感
Module#delegate
扩展。推荐PyPI第三方库