在ruby的stdlib中可转发
forwardable的Python项目详细描述
通过委托轻松组合对象的实用程序。大致从 Ruby的forwardable标准库
要求
Python2.7或3.3 w/标准库。可能对其他版本的 Python也是
安装
$ pip install forwardable
用法
最常见的用例
@forwardable.forwardable()decorator允许您使用 def_delegator()和def_delegators()在类定义块中。
使用def_delegators()定义多个attr转发:
fromforwardableimportforwardable@forwardable()# Note the () here, which is required.classFoo(object):def_delegators('bar','add, __len__')def__init__(self):self.bar=set()foo=Foo()foo.add(1)# Delegates to foo.bar.add()assertlen(foo)==1# Magic methods works, too
放松点,哈
定义单个转发
如果您只需要将一个方法委派给被委派者,只需 使用def_delegator:
fromforwardableimportforwardable@forwardable()classFoo(object):def_delegator('bar','__len__')def__init__(self):self.bar=set()assertlen(Foo())==0
它应该工作得很好。实际上,def_delegators()调用 def_delegator()在引擎盖下。
采摘
fromforwardableimportforwardable@forwardable()classMyDict(object):def_delegator('dct.get','__call__')def__init__(self):self.dct={'foo',42}d=MyDict()# Equivlant to d.dct.get('foo')assertd('foo')==42
不那么神奇的用法
@forwardable()decorator将def_delegator{,s}注入 模块作用域是临时的,这就是为什么不必导入它们 明确地。这是公认的魔法,但不鼓励使用 共import *在任何时候输入较少的字符总是很好的 没必要
如果你不愿意使用这种注射魔法,只需明确地说 from forwardable import def_delegator, def_delegators,用于 一个类定义,你就没事了。
许可证
麻省理工学院执照。