我正在编写一个小框架,用于编排AWS集群,并且有一些常见的层次模式反复出现。一种这样的模式是将实例集合收集到一个更大的对象中,然后将一些方法直接委托给所有实例。因此,我没有一次又一次地复制和粘贴相同的样板代码,而是用以下模式对其进行了抽象:
def __getattr__(self, item):
if not item in self._allowed_items:
raise NonDelegatableItem
def delegator():
for instance in self.all_instances:
getattr(instance, item)()
return delegator
是否有更好的方式或模式来完成授权?
我一直在研究这个问题,找到了两个解决方案。使用decorator更改类并创建delegator,或者使用delegator的描述符。我从第一个开始,然后发展到我更喜欢的第二个,所以我将从它开始。两者都可以在这里找到:https://gist.github.com/dhilst/7435a09b4419da349bb4cc4ae855a451和doctests:)
--编辑--
对于任何感兴趣的人,我把它做成一个图书馆:https://pypi.org/project/delegateto/
使用描述符
描述符是可以获取和设置的东西。在这种情况下,我们对描述符的可获取性感兴趣。这样定义的委托描述符
像这样使用
要调用描述符,只需调用方法
Foo('hello').upper()
。Magic方法也可以工作len(Foo('', [1,2,3,4]))
返回4。上面的gist链接有一个更强大的实现,但基本原理是相同的。使用装饰器
每当您需要以重复的方式更改类行为时,装饰器就是一个候选者。在这种情况下,decorator将在类中调用
setattr
,以创建delegator。用法也很简单,只要装饰一下班级,就可以了。decorator将就地修改类,以便返回相同的类。
这里有一个用法
委托方法的调用也是透明的
Foo('hello').upper()
。我更喜欢第二个,因为它对我来说更习惯。decorator具有支持多个方法的优势,但这也可以在描述符表单上实现。同样,我真的建议您看看要点:https://gist.github.com/dhilst/7435a09b4419da349bb4cc4ae855a451docstring中有很多示例。只要修改它们并执行脚本就可以了。
更新:
对于任何感兴趣的人,我都会把它做成pip包https://pypi.org/project/delegateto/
问候
当遍历整个类hirarchy而找不到属性时,调用
__getattr__
。因此,最好只生成一次方法并将其存储在类中。那么下次找到这个方法所需的时间就更少了。在这里,您可以看到代码的改编:
相关问题 更多 >
编程相关推荐