以简洁、明确的样式将方法和属性委托给子对象

superdelegate的Python项目详细描述


超级代表

以简洁、明确的方式将方法和属性委托给子对象

考虑一下排序列表的激励示例。为了封装列表并防止客户机破坏排序顺序,我们只允许某些方法通过底层列表:

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')

可以有多个delgate吗?你可以!

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')

灵感

这个库的灵感来自ruby activesupport的Module#delegate扩展。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java无法启动应用程序:JNLP错误   java根据用户输入在PreparedStatement中使用setTime()或setNull()   java EJB与同步   java以object为键通过hashmap进行搜索   java中的模10^9+7   针对包含其他对象的对象的java OOP最佳实践   如何将字符串作为HTML代码从Java文件读取到JSP页面?   java我的POM怎么了?“解析表达式..检测到递归表达式循环”   用于Hbase的Mapreduce的java NoSuchMethodError   JAVAlang.SecurityException:权限拒绝:启动意图{act=安卓.Intent.action.MAIN cat=[安卓.Intent.category.LAUNCHER]   数组初始化谜语Java   通过arraylist搜索时的java句柄关联