【发布时间】:2013-09-06 03:41:26
【问题描述】:
如何创建一个字典类“D”来存储某些类“A”的实例并继承“A”方法的包装版本?
例如,假设 a = A() 和 a.first() 是一个对 'a' 执行某些操作并返回某个对象的函数。然后我希望 d = D({'k0': a0, 'k1': a1}) 有一个属性 d.first() 返回 {'k0': a0.first(), 'k1': a1.first ()} 并更改 a0 和 a1 中的基础数据,就像调用 first() 一样。
此外,我只想公开 dict 类中尚不存在的方法(可能还有属性)(没有踩踏),并且我想动态地这样做(没有方法的硬编码A,我已经知道如何手动输入所有方法)。如果以某种方式更容易,也许考虑只处理不以'_'开头的方法。
另外,我希望“D”根据返回类型(后处理、包装任何内容)对调用的输出进行一些处理。
这似乎是个坏主意,但我只是想了解有哪些方法。从我目前的阅读来看,似乎我可以使用多重继承并编写自己的__new__ 函数或使用元分类做其他事情。但是传说是,除非您是大师,否则您通常不应该与__new__ 混在一起,所以这让我犹豫不决。这样做有一些装饰技巧吗?我想我也可以使用检查模块来遍历类“A”,但这感觉就像 hack。
更新:作为一个非常具体的例子。想象一下,我有一个 pandas.DataFrames 字典,并且我希望该集合尽可能像单个 DataFrame 一样出现和表现,甚至可以在 iPython 中使用选项卡完成方法(而且我没有使用 pandas.Panel)。为简单起见,只考虑只读行为(索引和选择),像 d.ix[0:10] 和 d.mean() 应该从将函数应用于字典中的所有帧返回一些东西,而 d['k0 '] 应该返回与键 'k0' 对应的字典中的值。硬编码和 getattr 的组合可以满足我的要求,但我正在探索如何用更少的硬编码来完成。
我认为这是一个常见的设计问题,您希望动态生成一个行为类似于它包含的对象的可迭代对象。
【问题讨论】:
-
你看过
__getattr__吗? -
@BrenBarn 您的意思是自己通过检查 dict 上的 getattr 然后检查“A”来处理继承?我想这是一个更简单的解决方案。
标签: python subclass multiple-inheritance metaclass