0

我经常发现自己创建了同质的对象集,我通常将它们存储在字典或列表字典中。

   a,b,c = MyClass(...), MyClass(...), MyClass(...)
   my_set = {'a':a,'b':b,'c':c}

在这样的场景中,共同的需求是

  • 从对象属性或方法返回齐次集
    • {k:k.prop for k in my_set}, 或者
    • {k:k.func() for k in my_set}
  • 基于对象的属性或方法的输出进行过滤
    • {k:k.prop for k in my_set if k.prop is blah}, 或者
    • {k:k.func() for k in my_set if k.func() is blah}
  • 将前两个需求串在一起

起初,这似乎表明我应该使用数据库。但是,我将不得不放弃使用任意对象作为元素所提供的自由。

我喜欢为这种类型的结构创建一个类(如果它不存在的话),它可以满足这些需求,比如......

   a,b,c = MyClass(...), MyClass(...), MyClass(...)
   my_set = {'a':a,'b':b,'c':c}
   my_set.prop # fufills first need
   my_set.func() # fufills first need
   my_set[prop = blah] # fufills second need
   my_set[prop= blah].prop.func() # third need

这样的功能存在吗?还是对这个对象的需求是糟糕设计的结果?

解决方案

按照@mike-muller 的建议覆盖__getattr__我在这里创建了一个类的方法

https://gist.github.com/arsenovic/5723000

4

4 回答 4

1

您正在寻找类的特殊方法。看看 __getattr____getitem__。您可以编写自己的课程。它的此类实例可以具有 a,bc作为属性,并且可以执行您所描述的操作。

像这样的事情可能会做你喜欢做的部分事情:

class DictCollcetion(object):
    def __init__(self, dict_):
        self.dict = dict_
    def __getattr__(self, name):
        return {k: k.name for k in self.dict}
    def __getitem__(self, key):
        return {k: k.key for k in self.dict}
于 2013-06-05T18:26:19.220 回答
0

我遇到过我操纵大量字典或对象的情况,就像你一样。通常这些对象是从数据库中提取出来并通过 ORM 填充的,但我也使用 CSV 文件完成了它。

我不确定我的需求是否足够频繁/普遍,以至于我会寻找一个模块来为我提供语法糖。

于 2013-06-05T18:35:34.070 回答
0

您是否考虑过只使用集合?

my_set = {myclass(...),myclass(...),myclass(...)}
props = {k.prop for k in my_set}

虽然您可以创建一个为您执行该映射的类,但对我来说,这并不明显让您的代码比坚持使用标准映射结构更清晰。

于 2013-06-07T15:14:10.810 回答
-1

按照@mike-muller 的建议覆盖_getattr__ 我在这里创建了一个类的方法

https://gist.github.com/arsenovic/5723000

于 2013-06-06T16:53:31.347 回答